它最终返回一个0bservable对象,这个过程会组织网络请求、解析响应结果、将响应结果发送给订阅0bservable的0bserver
这里我们需要拆成两步来看:loadServiceMethod()、invoke()分别做了什么。
2、网络请求的准备阶段
loadServiceMethod()完成的主要任务就是解析网络请求接口方法上的注解信息,得到数据适配器、数据解析器对象,最终封装一个CallAdapted继承了ServiceMethod的对象返回来,我们来一步一步看:
很显然,重点是parseAnnotations():
RequestFactory.parseAnnotations(retrofit, method)是重要的一步,它会去解析ApiService中对应方法上的注解信息、参数上的注解信息,准备网络请求的必要信息。
接下来又调用了HttpServiceMethod的parseAnnotations(),HttpServiceMethod继承了ServiceMethod:
上面讲到创建retrofit对象时设置了RxJava数据适配器、Gson解析器工厂,现在要从工厂中得到对应的数据适配器、解析器,最后将这些数据封装到CallAdapted里。
HttpServiceMethod还重写了ServiceMethod的invoke()方法:
它的adapt方法最终调用了RxJava数据适配器的adapt()方法:
至此,loadServiceMethod()方法的执行流程就结束了,最终返回的就是一个继承了HttpServiceMethod的CallAdapted对象。同时准备好了 OkHttpCall、数据适配器、以及数据解析器。
3、数据适配器 结合之前的分析,调用ServiceMethod的invoke()方法最终就是调用RxJava数据适配器的adapt()方法,参数就是OkHttpCall。
数据适配器对象是通过数据适配器工厂RxJava2CallAdapterFactory创建的:
所以adapt()方法会返回一个Observable对象,但还是太过粗略了,我们需要进一步探究该对象的奥秘。
按照上边的分析,应该先执行new CallExecuteObservable<>(call),得到responseObservable对象,再执行new BodyObservable<>(responseObservable),对其进一步封装,所以我们先看CallExecuteObservable类是如何实现的:
CallExecuteObservable类的核心就是subscribeActual()方法,当Observer订阅Observable时会执行该方法,即调用subscribe()方法时。 在subscribeActual()方法里会进行网络请求,并将结果传递给Observer。
那为什么BodyObservable类对responseObservable要进一步封装呢?去里边找找答案:
可以看到BodyObservable类的主要作用就是通过BodyObserver类增强我们自定义的observer功能,使其可以对CallExecuteObservable中observer.onNext(response)拿到的响应结果进一步处理,只取出响应体的数据发送给我们自定义的observer。
到这里数据适配器的主要任务就结束了,就是为整合RxJava做准备,调用Retrofit封装的OkHttpCall执行网络请求,并将结果发送给observer。
但还有些事情我们没搞清楚,那就是OkHttpCall,在CallExecuteObservable中执行它的call.execute()方法时,内部做了些什么,内部是如何通过OkHttp进行网络请求的。
4、OkHttp网络请求 OkHttpCall的execute()方法还是比较简单的:
所以OkHttpCall的execute()方法内部会构建OkHttp的Call对象,并来发起网络请求,但为什么是同步的请求呢?因为我们已经使用RxJava切换到子线程。这样Retrofit就和OkHttp关联上了。
5、数据解析器 OkHttpCall的parseResponse()的作用就是使用Gson将响应体的JSON字符串转换成指定对象。
关键的就是responseConverter.convert(catchingBody),responseConverter就是通过配置Retrofit时设置的GsonConverterFactory数据解析器工厂得到的,对应的数据解析器就是GsonRequestBodyConverter:
就是通过Gson解析响应体,转换成指定类型的对象。如果响应体是加密的,可以在这里先做解密工作,再做Gson解析。
三、总结 Retrofit是让开发者通过接口注解的形式描述网络请求,然后来解析接口,将网络请求封装到OkHttpCall里;数据适配器就是用Retrofit提供的OkHttpCall来组织网络请求,想怎么玩数据适配器自己决定就好了;数据解析器就相对简单了,把网络请求的结果转换成需要的格式即可。Retrofit、数据适配器、数据解析器,它们之间的职责划分还是很明确的,几乎没有业务上的耦合,完全是可插拔式的。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!