Retrofit 源码分析2-建造 Retrofit 时的参数配置

时间:2021-7-5 作者:qvyue

前面说到 Retrofit 的创建采用了 Builder 模式,这里来看看具体会配置的几项,

  • baseUrl 指定接口请求的域名地址,写法上要求以 / 结尾,例如 https://www.baidu.com/api/ 这样,至于接口地址,方法注释建议不要以 / 开头。 该方法的逻辑就是校验合法性,并赋值给成员变量 baseUrl。

  • client 指定网络请求客户端,这个是真正发起网络请求用的,入参类型为 OkHttpClient,可见 Retrofit 用的就是 OkHttp 来实现的网络请求。

public Builder client(OkHttpClient client) {
    return callFactory(Objects.requireNonNull(client, "client == null"));
}
public Builder callFactory(okhttp3.Call.Factory factory) {
    this.callFactory = Objects.requireNonNull(factory, "factory == null");
    return this;
}

因为 OkHttpClient 实现了 Call.Factory 接口,所以最终会将这个对象赋值给 callFactory 成员变量。这个 okhttp 的 Call.Factory 接口就定义了一个方法,叫 newCall 方法,入参是 Request 对象,返回是 Call 对象。

看了两个简单了,再来看两个稍微复杂些的,Converter 和 Adapter。先不从概念上来理解,从使用上下手,看看起的是什么作用。

  • Converter
    想想看网络请求总要有请求体和返回体的描述,Retrofit 默认情况下是以 OkHttp 的 RequestBody 和 ResponseBody 来描述的。但对于开发者来说,这么用可能不太友好。通常我们与服务端进行数据交互会以 JSON 的格式比较常见,这样一来需要我们自己做一层数据转换的操作。如果是别的数据格式,例如 moshi 什么的,又要做一遍这样的转换,实在不方便,于是 Converter 就为我们解决这样的困扰,通过配置转换器工厂创建转换器,实现自动转换数据格式,实现网络请求数据到业务逻辑数据模型的无缝对接。后面会以 Gson 转换器展开分析。

  • Adapter
    之前说过在利用 Retrofit 对象创建接口实现类对象后,就可以实现网络请求了,只不过调用接口方法返回的是以 Call 类型表示的(注意这个 Call 是 retrofit 里的泛型接口,不是前面说的 okhttp 里面的返回类型 Call)。这也是 Retrofit 默认的形式,但这样问题又来了。直接这么用的话,我们开发者需要自己处理好线程的控制,例如请求执行在子线程,回调在主线程。麻烦又重复的事情就尽量不要自己做了,于是 Adapter 就为我们解决这样的问题。同样,通过适配器工厂创建适配器,实现对一个网络请求另外一种表述(就是不再用 Call 了),例如 rxjava 系列就会用到 rxjava 里的特性,操作符等完成一个请求逻辑。后面会以 rxjava 适配器展开分析。

最后是 build 方法,该方法主要就是根据前面一些配置创建 Retrofit 对象,

public Retrofit build() {
    okhttp3.Call.Factory callFactory = this.callFactory;
    if (callFactory == null) {
        //看,如果没有配置 client,会默认创建一个
        callFactory = new OkHttpClient();
    }
    //自定义的适配器会添加到 callAdapterFactories 数组里
    List callAdapterFactories = new ArrayList(this.callAdapterFactories);
    callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
    List converterFactories = new ArrayList(1 + this.converterFactories.size() + platform.defaultConverterFactoriesSize());
    converterFactories.add(new BuiltInConverters());
    //自定义的转换器会添加到 converterFactories 数组里
    converterFactories.addAll(this.converterFactories);
    converterFactories.addAll(platform.defaultConverterFactories());
    
    return new Retrofit(
        callFactory,
        baseUrl,
        unmodifiableList(converterFactories),
        unmodifiableList(callAdapterFactories),
        callbackExecutor,
        validateEagerly);
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。