栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Retrofit的异步网络请求如何把结果切换到主线程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Retrofit的异步网络请求如何把结果切换到主线程

Retrofit的异步网络请求如何把结果切换到主线程

该文章需要对源码有一定了解再来查看

  1. .create() 方法中会返回一个 Proxy.newProxyInstance() 的动态代理对象

  2. 当通过代理对象调用接口中的方法时,会调用 InvocationHandler 中的 loadServiceMethod(method).invoke(args) 方法

  3. loadServiceMethod(method) 返回了一个 ServiceMethod 对象,即调用了其实现类 HttpServiceMethod 中的 invoke() 方法,该 invoke 方法中创建了一个 OkHttpCall 对象,并调用了 adapt(call, args)方法(call 即为 OkHttpCall 对象)

    此处以 HttpServiceMethod 的 CallAdapted 子类为例进行说明

  4. adapt() 方法中又调用了 callAdapter.adapt(call) 方法, callAdapter.adapt(call) 方法创建并返回了 DefaultCallAdapterFactory.ExecutorCallbackCall(executor, call) 对象

    (executor 为 Platform.Android() 中创建的 MainThreadExecutor, call 即为 OkHttpCall 对象)

    此处以 defaultCallAdapterFactories() 创造的 callAdapter 为例进行说明

即当通过代理对象调用接口中的方法时,获得的 Call 对象实际为 DefaultCallAdapterFactory.ExecutorCallbackCall 类型对象(实现了 Call 接口)。

异步网络请求要调用获得的 call 的 enqueue() 方法,即 DefaultCallAdapterFactory.ExecutorCallbackCall 的 enqueue() 方法

  1. 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() 类似,此处略

  1. OkHttpCall 的 enqueue() 方法中:

    • 创建 okhttp3.Call 对象
    • 调用了 okhttp3.Call 对象的 enqueue() 方法,在其中的回调方法中,对返回的 response 进行处理后,调用步骤 1 中调用时候传入的 CallBack 接口的匿名内部类的 onResponse() 或 onFailure() 方法。

综上所述,即通过 new Handler(Looper.getMainLooper()).post(r) 方法将异步网络请求返回的数据切换到主线程中使用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/273452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号