接着第三篇:
看一下 requestFactory.create 的实现:
![](https://img.haomeiwen.com/i6656438/edd0cb639c1eb44e.png)
最终是返回了一个 okhttp3.Request。到这里已经实现了 OkHttp Call 的创建,接着回到 OkHttpCall 的 enqueue 方法 继续往下看:
![](https://img.haomeiwen.com/i6656438/2451e70135e2f7af.png)
再详细看一下 call.enqueue 的详细代码:
![](https://img.haomeiwen.com/i6656438/f5862ce98436408d.png)
由此得知,Retrofit 对 OkHttp 的封装核心代码是 OkHttpCall 类,OkHttpCall 接受了子类传入的 Retrofit 的回调,内部创建了 OkHttp Call 对象并发起请求,在 OkHttp Call 请求的回调中再回调给 Retrofit 回调。
Retrofit 线程切换原理
Retroift 切换线程主要有两次切换,从主线程切换到子线程异步发起网络请求,请求结束后的回调中由子线程再切回到主线程触发回调,下面来详细分析两次线程切换的实现。
异步发起请求
由上面对 Retrofit 对 OkHttp 封装的分析可以得知,实际发起请求是通过 OkHttp 的 Call 对象的 enqueue 方法,该方法 OkHttp 内部已经封装为异步进行,所以从主线程切换到子线程异步发起网络请求是由 OkHttp 实现的,关于 OkHttp 的内部实现请关注我后面的文章,后面会写新的博客详细分析 OkHttp 的源码。
回调切回主线程
先回顾下发起请求后的回调操作:
![](https://img.haomeiwen.com/i6656438/62f8a15a6cf1d22c.png)
由 OkHttpCall enqueue 方法中的这段代码得知,OkHttp 请求回调中的 callback 是 ExcuteorCallbackCall 传入,再次回看 ExcuteorCallbackCall 的 callback 代码:
![](https://img.haomeiwen.com/i6656438/1bdc4133946de9ac.png)
很明显,切回主线程的主要功臣就是这个 callbackExecutor,他的初始化在构造器中,意味着又要跟踪源码找实现!根据最初分析的调用流程逆着找,首先是 DefaultCallAdapterFactory.get 中返回的匿名 CallAdapter 对象中创建了 ExcuteorCallbackCall:
![](https://img.haomeiwen.com/i6656438/dca2837ab942b116.png)
由源码得知是将 executor 传给了 ExecutorCallbackCall, executor 的初始化又是 DefaultCallAdapterFactory 的构造器,还要继续跟踪。DefaultCallAdapterFactory 是由 Platform.defaultCallAdapterFactories 创建,看源码:
![](https://img.haomeiwen.com/i6656438/8b5942ee5f296150.png)
callbackExecutor 以参数传入,继续逆着跟踪,defaultCallAdapterFactories 是在 Retrofit 类中 build() 方法中调用,继续看 Retrofit.build() 源码:
![](https://img.haomeiwen.com/i6656438/b0fa565fc6665173.png)
终于找到了 callbackExecutor 的初始化,点进去 platform.defaultCallbackExecutor 方法:
![](https://img.haomeiwen.com/i6656438/8cf3abe83d95fe30.png)
居然返回了个 NULL ???
冷静分析,Platform 是处理平台兼容的类,从 Platform 入手来看下 Platform 在 Retrofit 上是如何初始化的:
![](https://img.haomeiwen.com/i6656438/5cc39d3aba9b44e3.png)
![](https://img.haomeiwen.com/i6656438/28c27f656e7ff16d.png)
在点进去 Android 类查看其是否重写 defaultCallbackExecutor 方法:
![](https://img.haomeiwen.com/i6656438/516e7206c5c91631.png)
到这里总算明白了,ExcuteorCallbackCall 中回调的线程切换是由子线程切换到主线程执行回调方法,并且他的原理是通过 Handler 实现的。
流程图链接
个人使用 ProcessOn 随手画的 有些业余
https://www.processon.com/embed/6274eb155653bb45ea4b298d
写在最后
以上是本篇博客的全部内容,从 Retrofit 的调用流程入手详细分析了源码的执行过程、整体结构,在此基础上扩展分析了 Retrofit 线程切换原理以及如何实现对 OkHttp 的封装,当然 Retrofit 的源码远不仅如此,自定义 CallAdapter 结合 Rxjava、Kotlin 携程以及针对响应结果自定义解析的相关源码由于篇幅原因不在详细分析。
本篇博客的流程也是我个人学习 Retrofit 源码的过程,源码图片以及注释都是本人详细看过源码后标注的,流程图的制作也是本人原创(流程图画的有些业余),希望大家能多多支持点个赞,后面还会详细分析 OkHttp 的源码,OkHttp 以及 Retrofit 是当下 Android 最主流的两个网络请求库非常值得学习。
————————————————
版权声明:本文为CSDN博主「孙先森i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38356174/article/details/124558387
网友评论