深剖Retrofit 2.0 源码(一)
1.简介:
注意:
- 准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。
- 原因:网络请求的工作本质上是 OkHttp 完成,而Retrofit 仅负责 网络请求接口的封装。
可看出: - App应用程序通过 Retrofit 请求网络,实际上是使用Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
- 在服务端返回数据之后,OkHttp 将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。
2.与其他网络请求开源库对比
除了Retrofit和Okhttp,如今Android中主流的网络请求框架还有:
- Android-Async-Http:作者Loopj,基于HttpClient,作者已经停止对该项目维护,Android5.0后不推荐使用HttpClient,所以不推荐使用,Github地址:Android-Async-Http
- Volley:作者Google,基于HttpUrlConnection,封装了图片框架,支持图片加载,简单易用,都是把数据放在byte数组里,所以只适合轻量级网络交互,不适合用来上传文件。Github地址:Volley
3.Retrofit 的具体使用
使用 Retrofit 的步骤共有7个:
步骤1:添加Retrofit库的依赖
步骤2:创建 接收服务器返回数据 的类
步骤3:创建 用于描述网络请求 的接口
步骤4:创建 Retrofit 实例
步骤5:创建 网络请求接口实例 并 配置网络请求参数
步骤6:发送网络请求(异步 / 同步
详细过程可参考:这是一份详细的 Retrofit使用教程(含实例讲解)
4.源码详解
4.1网络通信过程对比
一般网络请求:开始=》配置网络请求参数=》创建请求对象=》发送网络请求=》解析数据=》处理数据
=》结束
Retrofit请求网络通信过程 :开始=》配置网络请求参数(通过注解)=》创建请求对象=》适配到具体的Call=》发送网络请求=》解析数据=》切换线程(子线程-主线程)=》处理返回数据=》结束
具体过程:
- 通过解析 网络请求接口的注解 配置 网络请求参数
- 通过 动态代理 生成 网络请求对象
- 通过 网络请求适配器 将 网络请求对象 进行平台适配(平台包括:Android、Rxjava、Guava和java8)
- 通过 网络请求执行器 发送网络请求
- 通过 数据转换器 解析服务器返回的数据
- 通过 回调执行器 切换线程(子线程 ->>主线程)
- 用户在主线程处理返回结果
4.2源码分析
1.创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://baidu.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
2.源码分析:
Retrofit实例是使用建造者模式通过Builder类进行创建的建造者模式:将一个复杂对象的构建与表示分离,使得用户在不知道对象的创建细节情况下就可以直接创建复杂的对象。
3.将实例分成“new Retrofit”、“Builder()”、“baseUrl(“http://fanyi.youdao.com/”)”、“addConverterFactory(GsonConverterFactory.create())”、“.build()”五部分逐一分析
步骤一:“new Retrofit”
<-- Retrofit类 -->
public final class Retrofit {
private final Map<Method, ServiceMethod> serviceMethodCache = new LinkedHashMap<>();
// 网络请求配置对象(对网络请求接口中方法注解进行解析后得到的对象)
// 作用:存储网络请求相关的配置,如网络请求的方法、数据转换器、网络请求适配器、网络请求工厂、基地址等
private final HttpUrl baseUrl;
// 网络请求的url地址
private final okhttp3.Call.Factory callFactory;
// 网络请求器的工厂
// 作用:生产网络请求器(Call)
// Retrofit是默认使用okhttp
private final List<CallAdapter.Factory> adapterFactories;
// 网络请求适配器工厂的集合
// 作用:放置网络请求适配器工厂
// 网络请求适配器工厂作用:生产网络请求适配器(CallAdapter)
// 下面会详细说明
private final List<Converter.Factory> converterFactories;
// 数据转换器工厂的集合
// 作用:放置数据转换器工厂
// 数据转换器工厂作用:生产数据转换器(converter)
private final Executor callbackExecutor;
// 回调方法执行器
private final boolean validateEagerly;
// 标志位
// 作用:是否提前对业务接口中的注解进行验证转换的标志位
<-- Retrofit类的构造函数 -->
Retrofit(okhttp3.Call.Factory callFactory,HttpUrl baseUrl,
List<Converter.Factory> converterFactories, List<CallAdapter.Factory> adapterFactories,
Executor callbackExecutor, boolean validateEagerly) {
this.callFactory = callFactory;
this.baseUrl = baseUrl;
this.converterFactories =unmodifiableList(converterFactories);
this.adapterFactories =unmodifiableList(adapterFactories);
// unmodifiableList(list)近似于UnmodifiableList<E>(list)
// 作用:创建的新对象能够对list数据进行访问,但不可通过该对象对list集合中的元素进行修改
this.callbackExecutor = callbackExecutor;
this.validateEagerly = validateEagerly;
// 仅贴出关键代码
}
成功建立一个Retrofit对象的标准:配置好Retrofit类里的成员变量,即配置好:
- serviceMethod:包含所有网络请求信息的对象
- baseUrl:网络请求的url地址
- callFactory:网络请求工厂
- adapterFactories:网络请求适配器工厂的集合
- converterFactories:数据转换器工厂的集合
- callbackExecutor:回调方法执行器
所谓xxxFactory、“xxx工厂”其实是设计模式中工厂模式的体现:将“类实例化的操作”与“使用对象的操作”分开,使得使用者不用知道具体参数就可以实例化出所需要的“产品”类。
这里详细介绍一下:CallAdapterFactory:该Factory生产的是CallAdapter,那么CallAdapter又是什么呢?CallAdapter详细介绍:
- 定义:网络请求执行器(Call)的适配器
1. Call在Retrofit里默认是OkHttpCall
2. 在Retrofit中提供了四种CallAdapterFactory:ExecutorCallAdapterFactory(默认)GuavaCallAdapterFactory、Java8CallAdapterFactory、 - 作用:将默认的网络请求执行器(OkHttpCall)转换成适合被不同平台来调用的网络请求执行器形式。 如:一开始Retrofit只打算利用OkHttpCall通过ExecutorCallbackCall切换线程;但后来发现使用Rxjava更加方便(不需要Handler来切换线程)。想要实现Rxjava的情况,那就得使用RxJavaCallAdapterFactoryCallAdapter将OkHttpCall转换成Rxjava(Scheduler):
- 好处:用最小代价兼容更多平台,即能适配更多的使用场景
所以,接下来需要分析的步骤2、步骤3、步骤4、步骤4的目的是配置好上述所有成员变量
由于篇幅原因,有关Retrofit的其他内容,就暂时放到下篇文章!
参考:
这是一份详细的 Retrofit使用教程(含实例讲解)
《Android 百大框架源码解析》