手记

【九月打卡】第8天 开源框架 Retrofit 源码解读

课程名称BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师DocMike

课程内容

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。网络请求还是通过 OkHttp 来完成的。一个完整的网络请求大致要经历以下的过程:配置网络请求参数、创建网络请求对象、发送网络请求、解析服务端返回的数据、根据业务逻辑处理数据。

Retrofit 在其中扮演的角色是,通过使用设计模式,动态代理、注解等方式,实现业务逻辑的解耦。Retrofit 具体的过程概括起来包括以下几个步骤:

  1. 解析网络请求接口的注解配置网络请求参数;
  2. 动态代理生成网络请求参数;
  3. 网络请求适配器,将网络请求对象,进行平台适配;
  4. 网络请求执行器,发送网络请求;
  5. 数据转换器,解析服务器返回的数据;
  6. 回调执行器,切换线程;
  7. 主线程处理返回结果;

接下来就按照 Retrofit 的执行过程,分别介绍。

1. 解析网络请求接口的注解

Retrofit 把网络请求的 URL 分成了两部分,一部分 baseurl 放在创建 Retrofit 对象时设置,另一部分在网络请求接口设置。如果接口里的 URL 是一个完整的网址,那么放在创建 Retrofit 对象时设置的部分可以不设置。

通过 RequestFactory 的 parseAnnotations() 解析 method(ApiService的method) 中的注解信息,给接口中每个方法的注解进行解析并得到一个 ServiceMethod 对象,以 Method 为键将该对象存入 LinkedHashMap 集合中。使用 LinkedHashMap 集合的好处是,通过 iterator().next() 获取到的是集合最不经常用到的元素,提供了一种 LRU 算法的实现。

2. 动态代理生成网路请求参数

通过代理模式中的动态代理模式,动态生成网络请求接口的代理类,并将代理类的实例创建交给 InvocationHandler 类 作为具体的实现,并最终返回一个动态代理对象。使用动态代理的好处是可以获得网络请求接口实例上的所有注解,便于封装 ServiceMethod。根据方法的标注对 ServiceMethod 的域进行赋值,为每个方法的参数的标注进行解析,获得一个 ParameterHandler<?> 对象。

在 InvocationHandler 的 invoke() 方法中,重点关注下面三行代码

ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);

在 loadServiceMethod() 方法中,采用单例模式实现一个 ServiceMethod 对象对应于网络请求接口里的一个方法,由于每次获取接口实例都是传入 class 对象,而 class 对象在进程内单例的,所以获取到它的同一个方法 Method 实例也是单例的,所以这里的缓存是有效的。这个方法的主要作用是读取网络请求接口里的方法,并根据前面配置好的属性配置 serviceMethod对象。

接着根据配置好的 serviceMethod 对象创建 okHttpCall 对象 ,最后调用 OkHttp,并根据 OkHttpCall 返回rxjava 的 Observe 对象或者返回 Call。

3. 网络请求适配器 CallAdapter

在 Retrofit 中,创建 Http 请求的网路执行器默认是 OkHttpCall。Retrofit 提供了四种网络请求的适配器,分别是 ExecutorCallAdapterFactory、GuavaCallAdapterFactory、Java8CallAdapterFactory、RxJavaCallAdapterFactory。

网络请求适配器的作用是将默认的网络请求执行器 OkHttpCall 转换成适合不同平台调用的网络请求执行器。 比如,项目最初使用 Retrofit 只打算利用 OkHttpCall 通过ExecutorCallbackCall 切换线程。但后来发现使用 Rxjava 更加方便(不需要 Handler 来切换线程),想要实现 Rxjava 的情况,那就得使用 RxJavaCallAdapterFactoryCallAdapter 将OkHttpCall 转换成 Rxjava(Scheduler) 即可。这样用最小的代价、兼容了不同的平台。

4. 数据转换器 Converter

数据转换器的作用是将服务端返回的数据类型转换为业务需要的数据类型。Retrofit 默认使用 Gson 进行解析,若使用其他解析方式(如Json、XML或Protocobuf),也可通过自定义数据解析器来实现(必须继承 Converter.Factory)。

5. 回调执行器 CallBackExecutor

CallBackExecutord 的主要作用是将最后 OkHttp 的请求结果,通过 Handler 回调到主线程。

课程收获

这一章内容,除了了解了 Retrofit 的源码和实现过程,还学习了一种查看源码的方法。面对一个开源框架源码,当不知道如何入手时,可以从它的执行过程入手。


0人推荐
随时随地看视频
慕课网APP