Retrofit源码读后感

206 阅读2分钟

Android开发中,Retrofit + okhttp 的组合非常流行,原因是使用方便,扩展性好。下面分析下Retrofit 源码及扩展性好的地方:

Retrofit 原理简单,通过动态代理实现接口请求,委托类是ServiceMethod.

这有个兼容处理,如果是普通委托请求,调用原生的委托;如果是平台委托请求,调用平台的委托;剩下的走Retrofit 中的委托。

Retrofit 细节不容易理解是因为框架用了很多泛型,注解。导致源码的可读性差。

ServiceMethod 做的事情

  • request参数转化,
  • response参数转化.
  • Retrofit.call 转成 okhttp.call,
private final okhttp3.Call.Factory callFactory;
  private final List<Converter.Factory> converterFactories;
  private final List<CallAdapter.Factory> adapterFactories;
  private final Executor callbackExecutor; 

这是Retrofit 中几个主要类,明白了他们的作用,也就明白了源码。

converterFactories 负责request,response参数转化。

ConvertFactory 主要的两个方法:requestBodyConverter,responseBodyConverter负责request,response的转化。

abstract class Factory {
    public Converter<ResponseBody, ?> responseBodyConverter() {
      return null;
    }
    public Converter<?, RequestBody> requestBodyConverter() {
      return null;
    }
    public Converter<?, String> stringConverter() {
      return null;
    }
  }

converterFactories 是个list ,根椐接口入参取到第一个合适的返回。

	int start = adapterFactories.indexOf(skipPast) + 1;
    for (int i = start, count = adapterFactories.size(); i < count; i++) {
      CallAdapter<?> adapter = adapterFactories.get(i).get(returnType, annotations, this);
      if (adapter != null) {
        return adapter;
      }
    }

在Retrofit 初始化时,都会加个 GsonConverterFactory.create(),另外可使用的扩展如下:

Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars : com.squareup.retrofit2:converter-scalars

adapterFactories 负责call, rxjava的转化。

Retrofit初始化时,会添加ExecutorCallAdapterFactoires,这也是我们默认使用的callAdapter. 也可以使用 RxjavaCallAdapterFactories是rxjava的转化器. 这根椐接口的出参选择使用哪一个。

@Override
  public CallAdapter<Call<?>> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
   ## 首先根椐 returnType 取出responseType , 返回ExecutorCallbackCall
    final Type responseType = Utils.getCallResponseType(returnType);
    return new CallAdapter<Call<?>>() {
      @Override public <R> Call<R> adapt(Call<R> call) {
        return new ExecutorCallbackCall<>(callbackExecutor, call);
      }
    };
  }
  ## enqueue 实际执行者
  @Override public void enqueue(final Callback<T> callback) {
      delegate.enqueue(new Callback<T>() {
        @Override public void onResponse(Call<T> call, final Response<T> response) {
          callbackExecutor.execute(new Runnable() {
            @Override public void run() {
              if (delegate.isCanceled()) {
                callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
              } else {
                callback.onResponse(ExecutorCallbackCall.this, response);
              }
            }
          });
        }
      });
    }

callFactory 负责 Retrofit.call (实现类为OkHttpCall)转成 okhttp.call

callbackExecutor 负责 处理结果的回调处理。在Android 平台下是 ExecutorCallbackCall