Android - 如何构建Retrofit

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发起网络请求,等待结束;
流程图

请添加图片描述

构建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运用了外观模式,对网络请求引擎、基地址对象、数据解析器、网络请求适配器、回调执行器进行了封装;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值