Android - 剖析Retrofit(1)- 如何构建

·  阅读 132

源码分析基于 2.7.0

Retrofit是什么东东呢
  • Retrofit是对网络请求的封装,其实就是对OKHttp的封装,跟Volley类似,Volley是对HttpClient、HTTPURLConnection的封装;
  • Retrofit使得网络请求更容易,我们可以使用Java方法来定义每一个网络请求,Retrofit2利用动态代理、反射、注解对方法进行解析,最后用OkHttp实现网络请求。
Retrofit网络请求大体流程
  1. Retrofit.Builder.builder构建Retrofit对象;
  2. Retrofit.create动态代理生成代理对象;
  3. 执行代理对象相应方法,得到Call,注意,这里的Call是Retrofit2.Call而不是OKHttp的Call;
  4. 调用Retrofit2.Call.enqueue发起网络请求,等待结束;
流程图

1png

构建Retrofit对象

是通过构建者模式来构建对象的,以下是Retrofit的主要属性;

public final class Retrofit {
    private final Map<Method, ServiceMethod<?>> serviceMethodCache = new ConcurrentHashMap<>();//1
    final okhttp3.Call.Factory callFactory;//2
    final HttpUrl baseUrl;//3
    final List<Converter.Factory> converterFactories;//4
    final List<CallAdapter.Factory> callAdapterFactories;//5
    final @Nullable Executor callbackExecutor;//6
    ......
}
  • 注释1:serviceMethodCache是请求方法的缓存集合,而ServiceMethod是对请求方法的封装,例如,ServiceMethod就是对getProductList方法的封装,包括方法注解、参数注解、参数类型、方法返回值,缓存可以减少注解解析以及反射;
  • 注释2:callFactory,网络请求引擎,默认使用OKHttpClient,负责生产真正发起请求的okhttp3.Call;
  • 注释3:baseUrl,网络请求的基地址对象,例如,将外部传入的"www.baidu.com/"封装成HttpUrl 赋值给baseUrl,基地址必须以"/"结尾,否则报错;
  • 注释4:converterFactories,数据解析器集合,主要负责对结果进行解析,例如将json转换成Bean对象;
  • 注释4:callAdapterFactories,网络请求适配器集合,负责对请求方法的返回值进行适配,可以适配成Retrofit2.Call或者Rxjava的Observable,默认使用DefaultCallAdapterFactory;
  • 注释5:callbackExecutor,回调执行器,将结果回调给相应线程,Android平台默认使用MainThreadExecutor,它内部维护主线程Handler;
问题思考
  • 为什么Retrofit用构建者模式构建? 构建者模式,使得构建更加简单,对外屏蔽了复杂的处理。个人觉得构建简单才是Build的核心价值。

构建对象时配置参数,大概有这么两种方式:

  1. 在new对象的时候直接传参数 在参数少的时候,这种方式还可以接受,一旦参数变多或者需要满足不同的场景,这样的方式就有点吃力。
public class Person {
    private long id;
    private String name;
    private String address;
    private int age;
    private double height;
    private double weight;
}

以Person 为例,需要配置6个属性,那么就有一个构造方法包含这6个属性,如果业务扩展到10个属性,为了兼容之前的代码,就得增加包含10个属性的构造方法,10个参数可读性就很差了;而构建者模式显然就比较灵活,不需要重写定义构造方法

  1. new对象调用无参的构造函数,后续通过set方法传值 通过set方法传值,跟构建者模式有点类似。但是set方法传值,会让调用者无法知道哪些值是必须set进入,只有在使用对象出现报错的情况下才知道(因为构建对象时没有报错点),而构建者模式,如果没有设置必要属性,在构造对象的时候就会报错,将报错提前了,保护了后续的业务代码
Retrofit的外观模式

Retrofit其实对的网络请求引擎、基地址对象、数据解析器、网络请求适配器、回调执行器的封装,对于调用者来说,只需要知道Retrofit 对象接口,无需关注内部的实现,多个子模块组合一个较大的模块提供给外部调用者,也是我们惯用的手法。

总结
  • Retrofit简化OKHttp的使用;
  • Retrofit对象的构建使用构建者模式
  • Retrofit运用了外观模式,对网络请求引擎、基地址对象、数据解析器、网络请求适配器、回调执行器进行了封装;

以上分析有不对的地方,请指出,互相学习,谢谢哦!

分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改