一、名詞解釋
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>