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

2021-06-10  本文已影响0人  jkwen

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

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。先不从概念上来理解,从使用上下手,看看起的是什么作用。

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

public Retrofit build() {
    okhttp3.Call.Factory callFactory = this.callFactory;
    if (callFactory == null) {
        //看,如果没有配置 client,会默认创建一个
        callFactory = new OkHttpClient();
    }
    //自定义的适配器会添加到 callAdapterFactories 数组里
    List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
    callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
    List<Converter.Factory> 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);
}
上一篇 下一篇

猜你喜欢

热点阅读