Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架( 二 )


看一下这个注解是怎么定义的注解是支持有默认值的 , 因为kotlin的方法是可以在变量中直接赋初值的 , 这样调用就不用传值了 , 所以这里也做一个支持 , 让调用时候更加简洁

Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
生成流程
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
代码的分析这里还是用ConfigService来分析
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
  • 1.首先流程图 , 我们会遍历出使用这个注解的类 , 此时我们就已经拿到了ConfigService这个元素的所有信息了 。
  • 2.接着我们会对ConfigService将包装起来 , 将他存在RepositoryClass类中 。
RepositoryClass这个类会保存ConfigService的类名 , 包名 , 类型和所有方法等
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
  • 3.会将ConfigService里的方法包装成AutoMethod(不同的注解会有不同的类型) , 存入RepositoryClass的method变量中

Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 

Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
通过上述操作后 , repositoryMap就存在所有使用过AutoAPi注解的类了 , 再将他做遍历 , 传入Repository类的生成器RepositoryClassBuilder
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
这个如果不添加startFuncBuild方法的话 , 这段代码就只会生成
open class ConfigRepository : BaseRepository<ConfigService>() {}
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
再来看看startFunBuild,根据你当前类中的方法使用的注解去选择对应的方法处理器
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
所有的方法处理器都是继承AbsFuncBuilder的 而子类需要对方法内的具体内容做输出 , 也可以在方法参数上做添加
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
AbsFuncBuilder类只会生成如下代码 , 他会将前面RepositoryMethod收集的信息做一个输出 。但是具体内容还是交由子类去输出的 , 因为每个注解对应输出的方法体是不一样的
suspend fun config2(page: String = "GS"): List<String> {// 具体内容是由子类完成的}2.NetStrategy注解这个注解可以传4个参数 strategy 是缓存策略 , effectiveTime是缓存时间 , timeUnit是时间单位 。
缓存策略默认是添加在方法上的 , 有时候同一个接口可能会因为不同场景而使用不同的缓存策略 。
  • 比如在刚进入主页时 , 使用页面初始化CacheFirst
  • 页面初始化后 , 再次下拉加载数据 , 使用NetCache
  • 在当前主页上拉加载 , 使用NetOnly
此时一个接口会分别使用三个不同的缓存策略
所以用isNeedAddParameter来判断 , 需不需要在方法参数中添加缓存策略的参数
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
代码的分析NetStrategy的收集必须放在注解处理器的最后面 , 因为我展示想不到有什么好办法可以知道 , NetStrategy这个注解 , 是与哪个方法注解捆绑使用了 。
所以必须在前面的注解收集完毕后 , 当我再次收集使用过NetStrategy注解的方法时 , 拿到方法名 , 再与repositoryMap中储存的类的方法名做比较 , 如果一致 , 则表示该方法使用了NetStrategy注解 , 需要做缓存
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
3.AutoFlowApi注解介绍使用注解生成的代码下面分析一下生成方法的各个方法
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

文章插图
 
viewModelScopeCoroutine
一个与viewmodel生命周期绑定的协程 , 默认在主线程运行


推荐阅读