Re本篇是从整体上来说明Retrofit的结构:

相信很多开发者在使用Okhttp的时候也对其进行过封装,github上也能搜到不少Okhttp封装的源码;总的来看Retrofit是Okhttp的二次封装。其实不论怎么封装,封装的核心只不过是对Request和Response的构建做一个相应的变化而已,到头来真正执行网络请求的还是Okhttp的Call对象:同步请求为call.execute();异步请求为call.enqueue();那么Retrofit对Okhttp做了怎么的封装设计呢?

其实Retrofit从整体上看主要添加了两个接口集合:

.addConverterFactory(GsonConverterFactory.create(initGsonConverter()))// Converter集合
   .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //CallAdapter集合

android retrofit2 文件下载 安卓retrofit原理_Retrofit

其中两个集合的作用通过下图可以直观的表达出来:

android retrofit2 文件下载 安卓retrofit原理_泛型_02

也即是说api方法的返回值类型决定了使用哪一个CallAdapter,而返回值所包含的泛型的真实类型决定了使用哪一个Converter。

或者说每个Api方法的返回类型都需要一个CallAdapter对象和一个Converter与之对应。且每一个API方法都对应封装成一个ServiceMethod对象,所以下图就不难理解了:

android retrofit2 文件下载 安卓retrofit原理_同步请求_03


具体是怎么从上面两个集合中检索的所需的CallAdater和Converter对象的。而Retrofit的扩展性也主要体现在CallAdapter和Converter两个接口的实现而已,比如Retrofit的内部就提供了如下CallAdapter:

android retrofit2 文件下载 安卓retrofit原理_Retrofit_04

和如下几个Converter

android retrofit2 文件下载 安卓retrofit原理_封装_05

所以结合上面的讲解Retrofit的整体流程图就出炉了:

android retrofit2 文件下载 安卓retrofit原理_同步请求_06

到此为止Retrofit源码分析讲解完毕