一、名词解释
Service
:定义的接口类
ServiceMethod
:Service 中的方法
Call<R>
:参数类型是 R 的 Call,实际发起网络请求的类
responseType(R)
:Call<> 的参数类型;如 Call<AClass> 的 responseType 为 AClass
CallAdapter<R, T>
:适配器,将一个 Call 对象转为一个类型 T 的对象
returnType(T)
:
- CallAdapter<R, T> 转换出的对象类型
- ServiceMethod 的返回值类型
- 这个类型,要么是 Call<>,要么是 Call<> 的代理类。如 Call、Observable
- 这个类型,一定是一个参数化类型( ParameterizedType ),它的参数类型就是 Call<> 的参数类型(即 responseType、R)
二、使用
- 定义 Service 接口
- 创建 Retrofit 对象
- 创建 Service 对象
- 调用 Service 方法
三、原理
- 创建 Service 对象 动态代理,动态生成 Service 接口类的实现类
- 调用 Service 方法 InvocationHandler 里统一处理
- InvocationHandler 如何处理
- 创建 ServiceMethod(load)
- 解析注解,得到 RequestFactory、CallAdapter、Converter
- 调用 ServiceMethod(invoke)
- 创建 Call
- 通过 RequestFactory、CallFactory、Converter 生成 Call
- 转换 Call
- CallAdapter:
T adapt(Call\<R\> call)
- 返回一个代理了 Call<R> 的 T 对象
- CallAdapter:
- 创建 Call
- 创建 ServiceMethod(load)
四、问题
1、RequestFactory、CallFactoty、CallAdapter.Factory、Converter.Factory 都在哪里生成?他们的产品都在哪里生成(即 Factory 在哪里使用)?他们的产品在哪里使用?
CallFactory
、List<CallAdapter.Factory>
、List<Converter.Factory>
在 Retrofit 对象创建时生成。
- 它们是所有 ServiceMethod 共享的东西
RequestFactory
、CallAdapter
、Converter
在 ServiceMethod 对象创建时生成。
- 它们对于每个 ServiceMethod 可能有不同的值
... parseAnnotations(...) {
...
return new HttpServiceMethod<>(requestFactory, callFactory, callAdapter, responseConverter);
}
RequestFactory
、CallFactory
、Converter
在创建 Call 时使用
CallAdapter 在转换 Call 时使用
2、几种 CallAdapterFactory 的作用?
- DefaultCallAdapterFactory
将 Call<R> 转为
Call<R>
(它自己) - RxJava2CallAdapterFactory
将 Call<R> 转为
Observable<R>
- CompletableFutureCallAdapterFactory
将 Call<R> 转为
CompletableFuture<R>
- ExecutorCallAdapterFactory
将 Call<R> 转为
ExecutorCallbackCall<R>