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

2次阅读

共计 3478 个字符,预计需要花费 9 分钟才能阅读完成。

对我的项目的根本介绍

  • 1. 整个框架次要是给 MVVM 框架应用的,本人写完 interface 接口后,通过自定义的注解就能主动生成接口办法
  • 2. 用 Kotlin 的 Flow 去代替 Rxjava,因为我发现 RxJava 性能很弱小,然而大家都只是在 Http 层面应用了一下,既然要用 Kotlin 外面就曾经有 Flow,那我还不如少增加一个库
  • 3. 通过 jetpack 的 Room 数据库实现网络申请的存储,缓存策略也用过注解去实现。
  • 4. 发动的网络申请是与宿主生命周期绑定的,在网络申请回来之前,宿主曾经销毁的话,网络申请也会中断的

根本应用办法

1. 先定义接口类

和 Retrofit 一样,须要定义一个接口类

其中 @AutoApi@AutoFlowApi@NetStrategy 是自定义的注解,前面会介绍到。

2. 要先编译,会在你的接口类的文件夹下生成一个 xxxRepository.class

这是通过注解主动生成的文件,应用了 kotlinpoet 并且这里 apiService 就是通过 Retrofit 拿到的接口代理

3. 在 viewmodel 拿到对应 Repository 类的办法

4. 在对应中央通过 viewmodel 调用

调用接口,传入对应参数

在适合的中央察看

Retrofit 的封装

下面说到在 Repository 类的 apiService 就是通过 Retrofit 拿到的接口代理类。所以先进去看看 apiService 好了

能够看到 apiService 是 BaseRepository 的变量 而咱们生成的 Repository 都是继承 BaseRepository 的

当咱们调 ConfigRepository 类中的办法时候,就会将 ConfigRepository 传入findNeedType

findNeedType 办法就会将 ConfigRepository 对应的 ConfigService 失去并且返回进来

所以 apiService 就相当于这样,如同有点 Retrofit 的 create 办法的样子了

var apiService: T = HttpProvider.defaultCreate(ConfigService) as Class<out T>)

咱们持续进入 HttpProvider.defaultCreate

能够看到newRetrofit(), 并且传入了一个 HttpConfig, 看到这个名字就晓得这是 Http 的配置 接着是 newCreate(),接管了咱们的接口 service 类

首先看看 newRetrofit 办法

这几行代码就是创立了一个 Retrofit 对象并且保存起来,最初返回进来。然而他是怎么和 HttpConfig 分割起来的呢?

咱们能够看到这里将生成的 Retrofit.Builder()传给了HttpConfig 的办法 build 里,咱们进去看一看

能够看到这里就是咱们再相熟不过的 Retrofit 的配置环节

所以通过 newRetrofit 办法,咱们就将 Retrofit 对象配置好并且拿到 Retrofit 对象,还保存起来不便下次复用

在看看 newCreate()办法

这是个扩大函数,是 Retrofit 的扩大函数 将传入的 ConfigService 通过 Retrofit.create()生成代理类,并且保存起来复用

注解的介绍

1.AutoApi

咱们从最简略的 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<ConfigService>() {}

再来看看startFunBuild, 依据你以后类中的办法应用的注解去抉择对应的办法处理器

所有的办法处理器都是继承 AbsFuncBuilder 的 而子类须要对办法内的具体内容做输入,也能够在办法参数上做增加

AbsFuncBuilder类只会生成如下代码,他会将后面 RepositoryMethod 收集的信息做一个输入。然而具体内容还是交由子类去输入的,因为每个注解对应输入的办法体是不一样的

suspend fun config2(page: String = "GS"): List<String> {// 具体内容是由子类实现的}

2.NetStrategy 注解

这个注解能够传 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 申请的办法,很简略看一看就好

代码的剖析

通过下面剖析咱们能够晓得,你新写一个注解,其实就只须要编写两个类就好了

  • 一个继承 RepositoryMethod 的参数收集器
  • 一个继承 AbsFuncBuilder 的办法具体内容输入器

所以咱们间接看到 AutoFlowApi 的这两个类

AutoFlowMethod

能够说和 AtoMethod 截然不同了,都是收集默认参数 不一样的中央就是上面的一些配置

通过重写 AbsFuncBuilder 的裸露进去的配置办法,去批改办法的配置信息,比方图中的

  • isNullable, 办法返回值是否为 null
  • isNeedSuspend, 办法是否是须要 suspend 关键字
  • isNeedReturnType, 办法是否须要返回值

AutoFlowApiFuncBuilder

这个是 AutoFlowApi 注解最要害的办法了,外面代码比拟多,然而也没什么好解释的,就是对 kotlinpoet 的应用,比拟繁琐且无聊。

就是将你要生成的语句写进去,而后变量用规定字符代替

接着就是生成句子,将语句外面的规定字符,用你的变量去代替就好了

结尾

其实这个框架写的时候没思考其全面性和兼容性,就打算先写进去试一试。其实还有很多中央能够批改和扩大。

明天的文章就到这里,感谢您的浏览,有问题能够在评论区留言探讨,期待与大家共同进步。喜爱的话不要忘了三连。大家的反对和认可,是我分享的最大能源。

正文完
 0