前面说到 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);
}
网友评论