什么是Retrofit框架?
Retrofit其实我们可以理解为OkHttp的加强版,它也是一个网络加载框架。底层是使用OKHttp封装的。准确来说,网络请求的工作本质上是OkHttp完成,而 Retrofit 仅负责网络请求接口的封装。它的一个特点是包含了特别多注解,方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。
本文中的Retrofit均指代Retrofit2.0,以目前最新的2.4.0版本为例子。
Retrofit入门
Retrofit 其实相当简单,简单到源码只有37个文件,其中22个文件是注解还都和HTTP有关,真正暴露给用户的类并不多。
Retrofit采用了建造者模式来保证这个类构建的确保了相应的默认值和规范性
|
|
我们使用Retrofit2分以下三步
|
|
第一步解析构建Retrofit
|
|
从上面可以看到
(1)为什么说Retrofit2是基于OKhttp3的封装,因为CallFactory其实调用的就是OKhttpClient,所以说Retrofit2是基于OkHttp3的封装。
(2)callbackExecutor回调执行器,这个是用于网络请求返回后回调到主线程的。我们知道,在利用OkHttp3进行网络请求时,我们需要手动回调到主线程,以便更新UI。那我们来看看这个默认的defaultCallbackExecutor是不是这样。
|
|
从上面代码可以看到这个Platform的作用是判断当前作用的平台以及创建好主线程和进行回调。所以当我们调用platform的defaultCallbackExecutor时,实际上调用的是Android这个类的defaultCallbackExecutor方法,而这个方法返回的是MainThreadExecutor,它的作用就是利用handler将执行结果回调到主线程中。
(3)callAdapterFactories适配器列表,这里面存放的是所有的Call适配器CallAdapter。这个CallAdapter是干嘛的呢?我们知道Retrofit2底层是用Okhttp3来请求网络的,那势必是通过OkHttp3的Call来执行请求,但是我们在实际使用Retrofit2时,可能需要结合请他的三方库,常见的比如RxJava,那我们接口中所需要返回的可能就是Observable而不是Call了。
|
|
所以Retrofit2就需要一个Call适配器CallAdapter,来将Call转换为我们需要的Observable,这就是CallAdapter的作用。
(4)converterFactories返回结果转换器列表,这里面存放的是将网络返回结果,也就是OkHttp3返回的Response,解析转换成我们需要的实际类型,比如WeatherBean实体类。如GsonConverterFactory就是一个常用的转换器,相当于Retrofit2把我们直接使用Okhttp3来请求网络数据时需要将返回结果进行Gson解析的动作也替我们做了。
第二步解析ApiService接口是如何转化为我们的接口请求调用的
在第二步骤中我们使用了retrofit.create添加服务接口
|
|
我们进一步看一下create方法到底做了什么事情看到以下代码其实做的事情明显,就是做了接口校验和创建动态代理。(不熟悉动态代理的童鞋可以去自行百度一下)
|
|
最后返回的是loadServiceMethod方法我们再进去看看调用了什么东西
|
|
|
|
|
|
(1)第一步是使用创建动态代理进一步进行解析方法和配置
(2)第二步解析完方法并且根据前面的Retrofit配置进一步的解析注解来配置CallAdapter对象和Converter对象
(3)第三步解析完所有的方法和对象后创建OkHttpCall
第三步进入网络请求
在回顾一下上面我们请求的是这个实际上调用的就是OkHttpCall的queue方法
|
|
由于我们在Retrofit2里的默认Android的CallAdapterFactory配置转换是ExecutorCallAdapterFactory(详情可以去看Platform类里)
|
|
然后我们来看以下OkHttpCall里的enqueue方法
所以很明显里面实际上调用的就是Okhttp3的Call类来执行相应的网络请求。
总结
(1)这里我们分析了Retrofit的创建过程,可以发现Retrofit中核心部分包括OkHttpClient、Call适配器、Response转换器以及用于将请求回调到UI线程的回调执行器等。
(2)Retrofit的创建采用的是Builder模式,定制化程度很高,我们可以设置自己的OkHttpClient,也可以实现自定义的Call适配器和Response转换器,以及请求的回调执行器。
(3)可见Retrofit虽然做了很大程度的封装,但是灵活性扩展性依然很高,我们几乎可以扩展更改网络请求的大部分过程。
(4)Retrofit2中最主要的就是3个类:Retrofit、ServiceMethod和OkHttpCall。这三个类指责明确,相互配合共同完成整个网络调用的流程。
- Retrofit负责供外部初始化和定制,保存CallAdapter的列表和ResponseConverterFactory列表。
- ServiceMethod对应每一个接口方法的信息,包括解析注解和参数等,同时它也是连接Retrofit和OkHttpCall的桥梁。ServiceMethod中保存着当前接口对应方法所需要的CallAdapter和ResponseConverter。利用CallAdapter将OkHttpCall转换成接口需要的类型,供接口调用。利用toResponse方法让OkHttpCall调用ResponseConverter解析网络请求返回的结果。
- OkHttpCall则是用来执行具体网络请求。Retrofit2没有直接使用OkHttp3的Call接口,而是有自己的Call接口。在OkHttpCall内部通过组合的方法持有OkHttp3的Call接口,并通过ServiceMethod的toCall方法得到OkHttp3的call来进行网络请求,减少对OkHttp3的耦合。