Retrofit是什么东东呢
- Retrofit是对网络请求的封装,其实就是对OKHttp的封装,跟Volley类似,Volley是对HttpClient、HTTPURLConnection的封装;
- Retrofit使得网络请求更容易,我们可以使用Java方法来定义每一个网络请求,Retrofit2利用动态代理、反射、注解对方法进行解析,最后用OkHttp实现网络请求。
Retrofit网络请求大体流程
- Retrofit.Builder.builder构建Retrofit对象;
- Retrofit.create动态代理生成代理对象;
- 执行代理对象相应方法,得到Call,注意,这里的Call是Retrofit2.Call而不是OKHttp的Call;
- 调用Retrofit2.Call.enqueue发起网络请求,等待结束;
流程图
构建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的核心价值。
构建对象时配置参数,大概有这么两种方式:
- 在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个参数可读性就很差了;而构建者模式显然就比较灵活,不需要重写定义构造方法。
- new对象调用无参的构造函数,后续通过set方法传值
通过set方法传值,跟构建者模式有点类似。但是set方法传值,会让调用者无法知道哪些值是必须set进入,只有在使用对象出现报错的情况下才知道(因为构建对象时没有报错点),而构建者模式,如果没有设置必要属性,在构造对象的时候就会报错,将报错提前了,保护了后续的业务代码。
Retrofit的外观模式
Retrofit其实对的网络请求引擎、基地址对象、数据解析器、网络请求适配器、回调执行器的封装,对于调用者来说,只需要知道Retrofit 对象接口,无需关注内部的实现,多个子模块组合一个较大的模块提供给外部调用者,也是我们惯用的手法。
总结
- Retrofit简化OKHttp的使用;
- Retrofit对象的构建使用构建者模式;
- Retrofit运用了外观模式,对网络请求引擎、基地址对象、数据解析器、网络请求适配器、回调执行器进行了封装;
以上分析有不对的地方,请指出,互相学习,谢谢哦!