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运用了外观模式,对网络请求引擎、基地址对象、数据解析器、网络请求适配器、回调执行器进行了封装;
以上分析有不对的地方,请指出,互相学习,谢谢哦!
最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。
小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击扫描下方二维码免费领取~
这里是关于我自己的Android 学习,面试文档,视频收集大整理**,有兴趣的伙伴们可以看看~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。