而findNeedType
方法就会将ConfigRepository
对应的ConfigService
得到并且返回出去
所以apiService就相当于这样,好像有点Retrofit的create方法的样子了
var apiService: T = HttpProvider.defaultCreate(ConfigService) as Class)
我们继续进入 HttpProvider.defaultCreate
可以看到newRetrofit()
,并且传入了一个HttpConfig,看到这个名字就知道这是Http的配置 接着是newCreate(),接收了我们的接口service类
首先看看newRetrofit方法
这几行代码就是创建了一个Retrofit对象并且保存起来,最后返回出去。 但是他是怎么和HttpConfig联系起来的呢?
我们可以看到这里将生成的Retrofit.Builder()传给了HttpConfig的方法build里
,我们进去看一看
可以看到这里就是我们再熟悉不过的Retrofit的配置环节
所以通过newRetrofit方法,我们就将Retrofit对象配置好并且拿到Retrofit对象,还保存起来方便下次复用
这是个扩展函数,是Retrofit的扩展函数 将传入的ConfigService通过Retrofit.create()生成代理类,并且保存起来复用
注解的介绍
==============================================================================================================================================================================================================================
我们从最简单的AutoApi
做引子,开始介绍整个注解框架
只要你的接口类方法中使用了这个注解,就会生成suspend
方法,非常的简单 接着我们来看看他是怎么实现的
看一下这个注解是怎么定义的
注解是支持有默认值的,因为kotlin的方法是可以在变量中直接赋初值的,这样调用就不用传值了,所以这里也做一个支持,让调用时候更加简洁
生成的流程
代码的分析
这里还是用ConfigService来分析
-
1.首先流程图,我们会遍历出使用这个注解的类,此时我们就已经拿到了ConfigService这个元素的所有信息了。
-
2.接着我们会对ConfigService将包装起来,将他存在RepositoryClass类中。
RepositoryClass这个类会保存ConfigService的类名,包名,类型和所有方法等
- 3.会将ConfigService里的方法包装成AutoMethod(不同的注解会有不同的类型),存入RepositoryClass的method变量中
通过上述操作后,repositoryMap就存在所有使用过AutoAPi注解的类了,再将他做遍历,传入Repository类的生成器RepositoryClassBuilder
这个如果不添加startFuncBuild
方法的话,这段代码就只会生成
open class ConfigRepository : BaseRepository() {
}
再来看看startFunBuild
,根据你当前类中的方法使用的注解去选择对应的方法处理器
所有的方法处理器都是继承AbsFuncBuilder
的 而子类需要对方法内的具体内容做输出,也可以在方法参数上做添加
AbsFuncBuilder
类只会生成如下代码,他会将前面RepositoryMethod
收集的信息做一个输出。但是具体内容还是交由子类去输出的,因为每个注解对应输出的方法体是不一样的
suspend fun config2(page: String = “GS”): List {
// 具体内容是由子类完成的
}
这个注解可以传4个参数 strategy
是缓存策略,effectiveTime
是缓存时间,timeUnit
是时间单位。
缓存策略默认是添加在方法上的,有时候同一个接口可能会因为不同场景而使用不同的缓存策略。
-
比如在刚进入主页时,使用页面初始化CacheFirst
-
页面初始化后,再次下拉加载数据,使用NetCache
-
在当前主页上拉加载,使用NetOnly
此时一个接口会分别使用三个不同的缓存策略
所以用isNeedAddParameter
来判断,需不需要在方法参数中添加缓存策略的参数
代码的分析
NetStrategy的收集必须放在注解处理器的最后面,因为我展示想不到有什么好办法可以知道,NetStrategy这个注解,是与哪个方法注解捆绑使用了。
所以必须在前面的注解收集完毕后,当我再次收集使用过NetStrategy注解的方法时,拿到方法名,再与repositoryMap中储存的类的方法名做比较,如果一致,则表示该方法使用了NetStrategy注解,需要做缓存
3.AutoFlowApi注解介绍
使用注解生成的代码
下面分析一下生成方法的各个方法
viewModelScopeCoroutine
一个与viewmodel生命周期绑定的协程,默认在主线程运行
这里不好解释,我直接画图了
CoroutineDataFetcher { apiService.getData() }.startFetchData()
apiService.getData() 就是发起网络请求,看一下CoroutineDataFetcher
startFetchData(),就是根据传入的缓存参数,去找到对应的缓存策略发起Http请求的方法,很简单看一看就好
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
【附】相关架构及资料
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
存中…(img-w2DFd7qR-1712228377319)]
[外链图片转存中…(img-W0v986JS-1712228377319)]
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。