Retrofit 源碼解析

一、名詞解釋

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 對象

四、問題

1、RequestFactory、CallFactoty、CallAdapter.Factory、Converter.Factory 都在哪裏生成?他們的產品都在哪裏生成(即 Factory 在哪裏使用)?他們的產品在哪裏使用?

CallFactoryList<CallAdapter.Factory>List<Converter.Factory> 在 Retrofit 對象創建時生成。

  • 它們是所有 ServiceMethod 共享的東西

RequestFactoryCallAdapterConverter 在 ServiceMethod 對象創建時生成。

  • 它們對於每個 ServiceMethod 可能有不同的值
... parseAnnotations(...) {
    ...
    return new HttpServiceMethod<>(requestFactory, callFactory, callAdapter, responseConverter);
}

RequestFactoryCallFactoryConverter 在創建 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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章