Retrofit的异步网络请求如何把结果切换到主线程
该文章需要对源码有一定了解再来查看
-
.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<T> 对象实际为 DefaultCallAdapterFactory.ExecutorCallbackCall
类型对象(实现了 Call<T>
接口)。
异步网络请求要调用获得的 call 的 enqueue()
方法,即 DefaultCallAdapterFactory.ExecutorCallbackCall
的 enqueue()
方法
DefaultCallAdapterFactory.ExecutorCallbackCall
的enqueue()
方法中直接调用了OkHttpCall
的enqueue()
方法,OkHttpCall
的enqueue()
方法传入了CallBack<T>
接口的匿名内部类,实现了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<T>
接口的匿名内部类的onResponse()
或onFailure()
方法。
综上所述,即通过 new Handler(Looper.getMainLooper()).post(r)
方法将异步网络请求返回的数据切换到主线程中使用