retrofit原理分析

一、Retrofit 整合 RxJava 基本使用

截屏2021-06-01 23.48.21.png

截屏2021-06-01 23.48.29.png

截屏2021-06-01 23.48.44.png 通过简单的配置就可以进行网络请求了。 下面我们来分析具体原理。

1、生成代理对象

我们以retrofit.create()作为分析的入口,它把网络请求配置的接口转换成一个实现了该接口的对象。里边核心的技术就是JDK动态代理

截屏2021-06-01 23.53.52.png 到这里我们需要明白两点:

Retrofit 通过JDK动态代理技术,使用ApiService接口生成了一个实现该接口的代理对象。 调用ApiService接口中的方法,会执行上边InvocationHandler的invoke()方法,相当于是对原接口中方法的具体实现,返回的是一个bservable对象 create()方法还是比较简单的,其实重要的内容在这里:

截屏2021-06-01 23.56.09.png

它最终返回一个0bservable对象,这个过程会组织网络请求、解析响应结果、将响应结果发送给订阅0bservable的0bserver

这里我们需要拆成两步来看:loadServiceMethod()、invoke()分别做了什么。

2、网络请求的准备阶段

loadServiceMethod()完成的主要任务就是解析网络请求接口方法上的注解信息,得到数据适配器、数据解析器对象,最终封装一个CallAdapted继承了ServiceMethod的对象返回来,我们来一步一步看:

截屏2021-06-01 23.56.47.png 很显然,重点是parseAnnotations():

截屏2021-06-01 23.57.41.png

RequestFactory.parseAnnotations(retrofit, method)是重要的一步,它会去解析ApiService中对应方法上的注解信息、参数上的注解信息,准备网络请求的必要信息。

接下来又调用了HttpServiceMethod的parseAnnotations(),HttpServiceMethod继承了ServiceMethod:

截屏2021-06-01 23.58.43.png 上面讲到创建retrofit对象时设置了RxJava数据适配器、Gson解析器工厂,现在要从工厂中得到对应的数据适配器、解析器,最后将这些数据封装到CallAdapted里。

HttpServiceMethod还重写了ServiceMethod的invoke()方法:

截屏2021-06-01 23.59.16.png

它的adapt方法最终调用了RxJava数据适配器的adapt()方法:

截屏2021-06-02 00.01.23.png 至此,loadServiceMe
thod()方法的执行流程就结束了,最终返回的就是一个继承了HttpServiceMethod的CallAdapted对象。同时准备好了 OkHttpCall、数据适配器、以及数据解析器。

3、数据适配器 结合之前的分析,调用ServiceMethod的invoke()方法最终就是调用RxJava数据适配器的adapt()方法,参数就是OkHttpCall。

数据适配器对象是通过数据适配器工厂RxJava2CallAdapterFactory创建的:

截屏2021-06-02 00.02.56.png 所以adapt()方法会返回一个Observable对象,但还是太过粗略了,我们需要进一步探究该对象的奥秘。

截屏2021-06-02 00.03.08.png 按照上边的分析,应该先执行new CallExecuteObservable<>(call),得到responseObservable对象,再执行new BodyObservable<>(responseObservable),对其进一步封装,所以我们先看CallExecuteObservable类是如何实现的:

截屏2021-06-02 00.07.41.png

截屏2021-06-02 00.07.56.png CallExecuteObservable类的核心就是subscribeActual()方法,当Observer订阅Observable时会执行该方法,即调用subscribe()方法时。 在subscribeActual()方法里会进行网络请求,并将结果传递给Observer。

那为什么BodyObservable类对responseObservable要进一步封装呢?去里边找找答案:

截屏2021-06-02 00.08.49.png

截屏2021-06-02 00.09.00.png 可以看到BodyObservable类的主要作用就是通过BodyObserver类增强我们自定义的observer功能,使其可以对CallExecuteObservable中observer.onNext(response)拿到的响应结果进一步处理,只取出响应体的数据发送给我们自定义的observer。

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取
T行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值