该文章需要对源码有一定了解再来查看
-
.create() 方法中会返回一个 Proxy.newProxyInstance() 的动态代理对象
-
当通过代理对象调用接口中的方法时,会调用 InvocationHandler 中的 loadServiceMethod(method).invoke(args) 方法
-
loadServiceMethod(method) 返回了一个 ServiceMethod 对象,即调用了其实现类 HttpServiceMethod 中的 invoke() 方法,该 invoke 方法中创建了一个 OkHttpCall 对象,并调用了 adapt(call, args)方法(call 即为 OkHttpCall 对象)
此处以 HttpServiceMethod 的 CallAdapted 子类为例进行说明
-
adapt() 方法中又调用了 callAdapter.adapt(call) 方法, callAdapter.adapt(call) 方法创建并返回了 DefaultCallAdapterFactory.ExecutorCallbackCall(executor, call) 对象
(executor 为 Platform.Android() 中创建的 MainThreadExecutor, call 即为 OkHttpCall 对象)
此处以 defaultCallAdapterFactories() 创造的 callAdapter 为例进行说明
即当通过代理对象调用接口中的方法时,获得的 Call
异步网络请求要调用获得的 call 的 enqueue() 方法,即 DefaultCallAdapterFactory.ExecutorCallbackCall 的 enqueue() 方法
- DefaultCallAdapterFactory.ExecutorCallbackCall 的 enqueue() 方法中直接调用了 OkHttpCall 的 enqueue() 方法, OkHttpCall 的 enqueue() 方法传入了 CallBack
接口的匿名内部类,实现了 onResponse() 以及 onFailure() 方法
-
onResponse() 中调用了 ExecutorCallbackCall.this.callbackExecutor 的 execute() 方法,即调用了 MainThreadExecutor 的 execute() 方法,即 new Handler(Looper.getMainLooper()).post(r),Runnable r中根据不同情况调用了callback.onResponse() 或者 callback.onFailure()
callback 即开发者调用 enqueue() 方法时传入的开发者自己实现的匿名内部类,调用的 callback.onResponse() 或者 callback.onFailure() 方法即对应开发者自己实现的 onResponse() 以及 onFailure()方法
-
onFailure() 与 onResponse() 类似,此处略
-
OkHttpCall 的 enqueue() 方法中:
- 创建 okhttp3.Call 对象
- 调用了 okhttp3.Call 对象的 enqueue() 方法,在其中的回调方法中,对返回的 response 进行处理后,调用步骤 1 中调用时候传入的 CallBack
接口的匿名内部类的 onResponse() 或 onFailure() 方法。
综上所述,即通过 new Handler(Looper.getMainLooper()).post(r) 方法将异步网络请求返回的数据切换到主线程中使用



