Retrofit 源码分析

Retrofit 使用例子

下面只展示了异步请求示例

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com")
        .build();

GitHubService service = retrofit.create(GitHubService.class);
service.search().enqueue(new retrofit2.Callback<String>() {
    @Override
    public void onResponse(retrofit2.Call<String> call, retrofit2.Response<String> response) {

    }

    @Override
    public void onFailure(retrofit2.Call<String> call, Throwable t) {

    }
});

源码分析

Retrofit 中使用了 OkHttp, 分析到后面就可以看到。
先来看创建 Retrofit 吧:

public Retrofit build() {
    // ...
    okhttp3.Call.Factory callFactory = this.callFactory;
    if (callFactory == null) {
        // 创建 callFactory 对象,也就是 Retrofit 的 callFactory.
        callFactory = new OkHttpClient();
    }

    Executor callbackExecutor = this.callbackExecutor;
    if (callbackExecutor == null) {
        // 创建 callbackExecutor 对象,platform 是 Android 的实例,其 defaultCallbackExecutor 方法返回的是 ExecutorCallAdapterFactory 对象
        callbackExecutor = platform.defaultCallbackExecutor();
    }

    List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
    // 把上面创建的 callbackExecutor 添加到 callAdapterFactories 中
    callAdapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
    // ...
    return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
      unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
}

上面代码主要创建了 retrofit 对象,还创建了这几个稍等分析会用到的对象,callFactory、callbackExecutor.

下面接着往下看 retrofit.create 方法,这里使用了代理模式,create 创建的 GitHubService 对象可以调用 search 方法,search 方法的执行就在代理的实现里面,这个就一起分析了。

public <T> T create(final Class<T> service) {
    Utils.validateServiceInterface(service);
    if (validateEagerly) {
        eagerlyValidateMethods(service);
    }
    // 代理实现, service.search 走的就是这里的 invoke 方法
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
            private final Platform platform = Platform.get();

            @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
              throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
                if (method.getDeclaringClass() == Object.class) {
                  return method.invoke(this, args);
                }
                if (platform.isDefaultMethod(method)) {
                  return platform.invokeDefaultMethod(method, service, proxy, args);
                }
                // 这里是主要内容
                /* 封装 ServiceMethod 对象,创建 ServiceMethod 对象时创建了 callAdapter 实例,callAdapterretrofit.callAdapter(returnType, annotations), 再往里看就是 retrofit 的成员变量 callAdapterFactories.get(i).get(returnType, annotations, this), callAdapterFactories 是在创建 retrofit 时,里面存的是 ExecutorCallAdapterFactory 对象
                        return new CallAdapter<Object, Call<?>>() {
                          @Override public Type responseType() {
                            return responseType;
                          }

                          @Override public Call<Object> adapt(Call<Object> call) {
                            return new ExecutorCallbackCall<>(callbackExecutor, call);
                          }
                        };
                这就是 ServiceMethod 的 callAdapter 对象
                 */
                ServiceMethod<Object, Object> serviceMethod =
                    (ServiceMethod<Object, Object>) loadServiceMethod(method);
                // 创建 OkHttpCall
                OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
                // 其中 callAdapter 在封装 ServiceMethod 对象时创建的,执行的 callAdapter.adapt(call) 返回的就是 new ExecutorCallbackCall<>(callbackExecutor, call)
                return serviceMethod.adapt(okHttpCall);
            }
        });
}

可以看到 service.search 返回的是 ExecutorCallbackCall 对象,它的成员变量 delegate 是上面创建的 OkHttpCall 对象,那么接下来的 enqueue 方法就是 ExecutorCallbackCall 的 enqueue 了。

    @Override public void enqueue(final Callback<T> callback) {
        checkNotNull(callback, "callback == null");
        // 主要看下面这一点,delegata.enqueue, delegate 是 OkHttpCall 对象,那接着看下一个 OkHttpCall 的 enqueue 方法把
        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()) {
                    // 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<T> call, final Throwable t) {
            callbackExecutor.execute(new Runnable() {
                @Override public void run() {
                    callback.onFailure(ExecutorCallbackCall.this, t);
                }
            });
        }
        });
    }

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

    okhttp3.Call call;
    Throwable failure;

    synchronized (this) {
        if (executed) throw new IllegalStateException("Already executed.");
        executed = true;

        call = rawCall;
        failure = creationFailure;
        if (call == null && failure == null) {
            try {
                // 创建 call 对象,serviceMethod.toCall -> callFactory.newCall(callFactory 就是在最开始创建 retrofit 对象的 OkHttpClient 实例) -> okHttpClient.newCall(这里使用的就是 OkHttp 框架的了) -> RealCall
                call = rawCall = createRawCall();
            } catch (Throwable t) {
                throwIfFatal(t);
                failure = creationFailure = t;
            }
        }
    }

    if (failure != null) {
        callback.onFailure(this, failure);
        return;
    }

    if (canceled) {
        call.cancel();
    }
    // call 是 RealCall 对象,接下来的 enqueue 方法跟分析 OkHttp 的就一样了
    call.enqueue(new okhttp3.Callback() {
        @Override public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse) {
            Response<T> response;
            try {
                response = parseResponse(rawResponse);
            } catch (Throwable e) {
                callFailure(e);
                return;
            }

            try {
                callback.onResponse(OkHttpCall.this, response);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }

        @Override public void onFailure(okhttp3.Call call, IOException e) {
            callFailure(e);
        }

        private void callFailure(Throwable e) {
            try {
                callback.onFailure(OkHttpCall.this, e);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    });
}

猜你喜欢

转载自blog.csdn.net/hexiaosa91/article/details/81714171