Retrofit源码浅析
这篇主要会走读一下Retrofit
的源码,解析一下里面遇到的一些设计模式,网络请求的过程等。
开始
从创建Retrofit
开始,看一下常见的创建Retrofit
的实例的方式
|
|
从上面的代码可以看出,Retrofit
并没有去真正的执行网络请求,还是交给了OkHttp
来进行实现,Retrofit
可以看作的对OkHttp
的一层非常棒的封装,Retrofit
的关注点是在如何让你更快捷更灵活的去进行网络请求。如果你使用过Retrofit
的话,你也会明白用Retrofit
去实现一次网络请求是多方便的事情。
retrofit.create
从Net net = retrofit.create(Net.class)
这里开始入手,用过Retrofit
的几乎都知道Retrofit
是用了动态代理,动态代理说简单点就是动态的去生成接口的实现类,也可以在原始的结果返回前对参数或者结果进行修改,这个特性也使得一些Hook
框架大量使用了动态代理,比如很著名的360的DroidPlugin
。有点扯远了,还是去源码里面去看看:
|
|
这里省略了一下判断的逻辑,但是主要的就是最后的三行代码,从方法的签名来看,是传进来一个接口类,返回一个接口类型的实例,但是这个实例的具体实现类型是由serviceMethod.callAdapter.adapt
方法动态决定了,而且这个接口里面的每一次方法调用,都会进入这个invoke
方法,也就是由接口的实现类去完成功能。例如,Retrofit
默认的请求方式是Call<T>
,这里默认的实现类就是ExecutorCallbackCall<T> implements Call<T>
,而在这个类里面又是用代理类的方式去交给Okhttp
的call
去执行真正的请求,这个就是后面再说了。
ServiceMethod
这个类主要是储存了请求的信息和Retrofit
的配置信息以及对请求注解的解析生成正常的地址和请求。
OkHttpCall
第二行OkHttpCall
可以看成是OkHttp
的call
在Retrofit
层面的一次封装。从上面一步看到,把请求参数和配置信息交给了这个OkHttpCall
,然后让OkHttp
去执行请求操作。
callAdapter
不知道该怎么去具体描述这个类的意思,可以理解成将请求转换成不同的请求形式,例如默认的call
或者常见的Rxjava
的Observable<T>
的形式亦或者是Agera
的Supplier<Result<T>>
的形式等等。以@drakeet
的retrofit-agera-call-adapter为例:
|
|
代码没太多难度,看看就明白了。也是非常棒的自定义CallAdapter
教程。
enqueue
异步请求的时候是这个样子的
|
|
而getLiveShows
返回的call
其实是上面说的ExecutorCallbackCall
,这个的enqueue
是这样的
|
|
调用了delegate.enqueue
这个delegate
就是上面说到的OkHttpCall
看这个里面的
|
|
注意的是这里几个call
的区别和三个enqueue
的区别和作用
###Converter
这个是用来将RequestBody
和responseBody
转换成相应的类型,具体去看看官方的GsonConverterFactory
就可以了