美文网首页
Retrofit 源码分析2-建造 Retrofit 时的参数配

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

作者: jkwen | 来源:发表于2021-06-10 07:30 被阅读0次

    前面说到 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<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);
    }
    

    相关文章

      网友评论

          本文标题:Retrofit 源码分析2-建造 Retrofit 时的参数配

          本文链接:https://www.haomeiwen.com/subject/uzzjeltx.html