Retrofit 源码解析

199 阅读2分钟

一、名词解释

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>