retrofit2源码阅读

1.retrofit.create 创建retrofit

2.loadServiceMethod(method).invoke(args) 动态代理method,并在repos.enqueue 中调用invoke

3.ServiceMethod.parseAnnotations(this, method)

4.RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method); 解析注解,生成requestFactory

5.HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory) 生成HttpServiceMethod 方法,初始化

RequestFactory requestFactory,
okhttp3.Call.Factory callFactory,
Converter<ResponseBody, ResponseT>responseConverter) {
this.requestFactory = requestFactory;
this.callFactory = callFactory;
this.responseConverter = responseConverter;

6.HttpServiceMethod 的invoke 为

@Override
  final @Nullable ReturnT invoke(Object[] args) {
    Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);
    return adapt(call, args);
  }
<pre><code> @Override
protected ReturnT adapt(Call&lt;ResponseT&gt; call, Object[] args) {
  return callAdapter.adapt(call);
}

现在开始追callAdapter

return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter);
CallAdapter<ResponseT, ReturnT>callAdapter =
createCallAdapter(retrofit, method, adapterType, annotations);</p>
<p>private static <ResponseT, ReturnT> CallAdapter<ResponseT, ReturnT> createCallAdapter(
Retrofit retrofit, Method method, Type returnType, Annotation[] annotations) {
try {
//noinspection unchecked
return (CallAdapter<ResponseT, ReturnT>) retrofit.callAdapter(returnType, annotations);
} catch (RuntimeException e) { // Wide exception range because factories are user code.
throw methodError(method, e, "Unable to create call adapter for %s", returnType);
}
}</p>
<p>CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this);</p>
<p>

现在开始追callAdapterFactories的get方法

List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));</p>
<p>return new CallAdapter<Object, Call<?>>() {
@Override
public Type responseType() {
return responseType;
}</p>
<pre><code>  @Override
  public Call&lt;Object&gt; adapt(Call&lt;Object&gt; call) {
    return executor == null ? call : new ExecutorCallbackCall&lt;&gt;(executor, call);
  }
};

实际上 adapt调用的是 ExecutorCallbackCall<>(executor, call) 方法

ExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) { this.callbackExecutor = callbackExecutor; this.delegate = delegate; }

初始化了一个call

retrofit.create(GitHubService::class.java) 整个代码 就是初始化了一个ExecutorCallbackCall service.listRepos 是获取接口上初始上的方法
repos.enqueue 实际上也就是调用 ExecutorCallbackCall里面的enqueue,

this.delegate = delegate; 这个delegate是invoke的第一行传入的OkHttpCall

@Override public void enqueue(final Callback<T> callback) { Objects.requireNonNull(callback, "callback == null");

  delegate.enqueue(
      new Callback&lt;T&gt;() {
        @Override
        public void onResponse(Call&lt;T&gt; call, final Response&lt;T&gt; response) {
          callbackExecutor.execute(
              () -&gt; {
                if (delegate.isCanceled()) {
                  // Emulate OkHttp's behavior of throwing/delivering an IOException on
                  // cancellation.
                  callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
                } else {
                  callback.onResponse(ExecutorCallbackCall.this, response);
                }
              });
        }

        @Override
        public void onFailure(Call&lt;T&gt; call, final Throwable t) {
          callbackExecutor.execute(() -&gt; callback.onFailure(ExecutorCallbackCall.this, t));
        }
      });

总结:retrofit2通过动态代理 + 注解取出关键信息,初始化接口里面的方法,初始化方法后用invoke,生成okhttpcall 调用 apat 初始化 试配器的calll

通过包装okhttp call实现enqueue ,将okhttp call装饰者模式包装了一层call,使用excute+handle

实现线程切换,回调接口

val retrofit = Retrofit.Builder()
.baseUrl("<https://api.github.com/>")
.addConverterFactory(GsonConverterFactory.create())
.build()</p>
<pre><code>    val service = retrofit.create(GitHubService::class.java)
    val repos: Call&lt;List&lt;Repo&gt;&gt; = service.listRepos("octocat")
    repos.enqueue(object:Callback&lt;List&lt;Repo&gt;&gt; {
        override fun onResponse(call: Call&lt;List&lt;Repo&gt;&gt;, response: Response&lt;List&lt;Repo&gt;&gt;) {

        }

        override fun onFailure(call: Call&lt;List&lt;Repo&gt;&gt;, t: Throwable) {

        }
    })