Android Retrofit源码流程分析三(Retrofit

2022-11-28  本文已影响0人  Bfmall

接着第二篇:

下面来针对这两个问题再做一系列的源码分析!

Retrofit 是如何封装 OkHttp

先来分析下 Retrofit 时在哪里发起请求的,上面的源码分析得出 ExecutorCallbackCall 的 enqueue 是经过动态代理后实际调用的方法,回看一下他的实现:


image.png

在调用了 delegate.enqueue 后触发了回调,delegate 是一个 Call 类型,在构造器中初始化,这次逆着来找一下他究竟是什么?他的 enqueue 方法具体干了什么?开始跟踪源码:


image.png

是 CallAdapter 的 adapt 方法中以参数传入的,根据文章上面调用流程的分析 CallAdapter 的调用发生在 CallAdapted 中:


image.png

而 Calladapted 的 adapt 调用发生在他的父类 HttpServiceMethod 的 invoke 方法中,在这里发现了 call 的初始化,是一个 OkHttpCall,点进去查看 OkHttpCall 的 enqueue 方法:


image.png

在 OkHttpCall 的 enqueue 方法中已经开始初始化 OkHttp 的 Call 对象了,看一下 createRawCall 是如何初始化的:


image.png

创建 Call 对象的代码就一行,看起来简单,实际又要硬着头皮跟踪源码,这一行代码关键的就是两个内部变量 callFactory 和 requestFactory,先看一下他们各自的类型以及初始化:


image.png

两个变量都是在 OkHttpCall 的构造其中赋初值,也意味着又要跟踪源码,先来看看 callFactory,他说一个 okhttp3.Call.Factory 类型,熟悉 OkHttp 的同志肯定记得,OkHttp 的使用需要先创建一个 OkHttpClient 然后新建一个 Request 对象,再用 OkHttpClient 将 Request 传入,就会得到一个 Call 对象就可以发起请求触发回调了,而 OkHttpClient 正是 okhttp3.Call.Factory 的子类,这么一说就明白了,callFactory 一定类似 OkHttpClient 是用于创建 OkHttp 的 Call 对象,而 requestFactory 大致就可以推测出他是用于构建 OkHttp 的 Request 对象的。
先来跟踪 callFactory 的初始化源码,OkHttpCall 对象是在 HttpServiceMethod.invoke 方法中创建,而 HttpServiceMethod 对象根据文章上面调用流程分析是其内部静态方法 parseAnnotations 创建,再来看下他的源码:


image.png

callFactory 传入的是 Retrofit 的 callFactory (这里也顺带找到了 requestFactory 的传入由方法参数传入),再接着回到 Retrofit 类中找寻 callFactory 的初始化:


image.png

由源码得知,callFactory 默认实现就是 OkHttpClient 跟之前的推测是一致的,了解了 callFactory 后再回过头看 requestFactory ,requestFactory 上面也看到是在 HttpServiceMethod 的静态方法 parseAnnotations 中以参数的形式传入,HttpServiceMethod.parseAnnotations 之前在 ServiceMethod 中看到过,回看 ServiceMethod 的代码:


image.png

requestFactory 是在 ServiceMethod 中创建,继续跟踪 RequestFactory.parseAnnotations :


image.png

继续跟踪 build() 方法:


image.png

这个方法的核心逻辑遍历了传入方法的注解,并且调用了 parseMethodAnnotation,看一下 parseMethodAnnotation 的实现:


image.png

看到这里应该很眼熟,if else 判断的注解就是 ApiServices 定义的方法的请求方式注解,parseMethodAnnotation 方法的作用就是解析 ApiServices 中方法的各种注解信息,并且保存在内部变量中,回到 build() 方法看返回了什么:


image.png
image.png

其实就是返回了一个包含注解解析结果的 RequestFactory。
了解了 callFactory 和 requestFactory 的作用后回到 OkHttpCall 类:


image.png

————————————————
版权声明:本文为CSDN博主「孙先森i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38356174/article/details/124558387

上一篇 下一篇

猜你喜欢

热点阅读