阅读 205

Retrofit 源码分析

说明:请结合其他文档和阅读源码来阅读

1.retrofit 是什么

准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。 原因:网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装

  • App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
  • 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用 户的需求对结果进行解析。

优势

  1. 对网络请求参数的适配,协议,表单,Restful
  2. 封装OkHttp,Call
  3. 数据结果封装

2.retrofit 总流程

3.代理实例创建过程

retrofit = new Retrofit.Builder()
         .baseUrl("")
         .addConverterFactory(GsonConverterFactory.create(new Gson()))
         .build();
IShareListService shareListService = retrofit.create(IShareListService.class);
复制代码

1: 成功建立一个Retrofit对象的标准:配置好Retrofit类里的成员变量

  • baseUrl:网络请求的url地址
  • callFactory:网络请求工厂
  • callbackExecutor:回调方法执行器
  • adapterFactories:网络请求适配器工厂的集合
  • converterFactories:数据转换器工厂的集合

2: 创建了一个ISharedListService 接口类的对象,create函数内部使用了动态代理来创建接口对象,这 样的设计可以让所有的访问请求都被代理

Call sharedListCall = sharedListService.getSharedList(2,1);
复制代码

调用getSharedList的时候,在动态代理里面,会存在一个函数 getSharedList,这个函数里面会调用 invoke,这个invoke函数也就是retrofit里面 invoke函数。 所以,动态代理可以代理所有的接口,让所有的接口都走 invoke函数 ,这样就可以拦截 调用函数 的执行,从而将网络接口的参数配置归一化

4.访问接口创建过程

5.网络请求过程

converter response2 javaBean

6.Retrofit中的设计模式

  1. Retrofit 实例使用建造者模式 通过Builder类构建。 当构造函数的参数大于4个,且存在可选参 数的时候既可以使用 建造者设计模式
  2. Retrofit 创建时的callFactory,使用工厂方法 设计模式,但是似乎并不打算支持其他的工厂。
  3. 整个retrofit 采用的时外观模式 。统一的调用创建网络请求接口实例和网络请求参数配置的方法
  4. retrofit里面使用了动态代理 来创建网络请求接口实例,这个是retrofit对用户使用来说最大的复用, 其它的代码都是为了支撑这个动态代理给用户带来便捷性的
  5. 使用了策略模式 对serviceMethod对象进行网络请求参数配置,即通过解析网络请求接口方法的参 数、返回值和注解类型,从Retrofit对象中获取对应的网络的url地址、网络请求执行器、网络请求适 配器和数据转换器
  6. ExecuteCallBack 使用装饰者模式 来封装callbackExecutor,用于完成线程的切换
  7. ExecutorCallbackCall 使用静态代理(委托) 代理了Call进行网络请求,真正的网络请求由okhttpCall执 行,然而okHttpCall不是自己执行,它是okhttp 提供call给 外界(retrofit)使用的唯一门户,其实这个 地方就是门面模式
  8. ExecutorCallbackCall 的被初始化是在 ExecutorCallAdapterFactory里面通过适配器模式 被创建的。 CallAdapter采用了适配器模式 为创建访问Call接口提供服务。默认不添加Rxjava则使用默认的 ExecutorCallAdapterFactory 将okhttp3.call转变成为 retroift中的call,如果有Rxjava则将okhttp3.call转化为 abservable。

文章分类
Android
文章标签