这篇blog主要是通过引导思路来了解Retrofit的工作流程,实际情况需要配合源码进行细节了解
调用流程
在使用Retrofit访问网络的时候,需要经过一下步骤:
//1.声明接口
public interface DemoService {
@GET("ActionServlet?action=login")
Observable<Result<Login>> readBaidu(@Query("username") String username, @Query("password") String password);
}
//2.实例化retrofit
retrofit = new Retrofit.Builder()
.baseUrl("服务器地址")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//3.创建服务
demoService = retrofit.create(DemoService.class);
//4.获取数据
demoService.readBaidu("传入参数");
情景分析
通过retrofit获取service
那么我们从哪里说起呢?就从第3步开始说起吧,从retrofit的create函数说起
(因为这一步作为切入点最能理解整个流程)
public <T> T create(final Class<T> service) {
//此处省略了无数代码
return Proxy.newProxyInstance(service,..);
}
create函数通过逆传进去的service,生成一个service的动态代理进行返回
动态代理
用最人性化的方式将就是代理人,从表面上看我是返回一个service给你,但其实当你调用service的时候,我会先偷偷做一些操作,然后再帮你调用这个方法,这就是简单一点的理解动态代理
调用service的方法
那么接下来,比如我们要获取百度的数据,通过service.getBaidu()方法。
根据上面的分析,我们其实就是调用代理的geibaidu()方法,在上面也说了,代理会在你调用之前偷偷地做一些见不得人的事,那么具体是什么呢?
return loadMethodHandler(method).invoke(args);
掌握动态代理的人应该都知道调用代理的方法其实就是InVocationHandler里面的invoke方法,那么如果你不了解也没关系,用人话说,就是你调用这个方法,我先把这个方法的一些信息解析一下,再去调用
那么怎么解析呢?就是通过MethodHandler这个类;
MethodHandler
有人可能会问,为什么不在代理类里面就直接调用方法,还要搞这么多莫名其妙的?
首先,你要思考一下,你在service里面只是声明了一个接口方法,还有一些注解信息,那么retrofit做什么呢?就是要解析这些注解,还有设置怎么访问网络,怎么解析网络返回的数据,这些retrofit不可能直接就在代理类里面做把?所以就有了MethodHandler这个类的存在了
看了上面这段话,我们也大概知道了MethodHandler主要做了什么事情把
MethodHandler最重要的四个属性:
- CallAdapter 决定网络请求的环境
- Converter 怎么解析数据结果以及解析数据用到的引擎
- RequestFactory 封装请求信息
- OkHttpCall 访问网络
用了最“人”的话来解释这四个角色了!!信心的人会发现,前俩个参数正是我们实例化retrofit的时候传进去的,所以这也就是第1步和第2步先跳过的原因了。
今晚没时间了,下次再补上各个模块解析