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

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)

我们继续进入 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() {

}

再来看看startFunBuild,根据你当前类中的方法使用的注解去选择对应的方法处理器

所有的方法处理器都是继承AbsFuncBuilder的 而子类需要对方法内的具体内容做输出,也可以在方法参数上做添加

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

suspend fun config2(page: String = "GS"): List {

// 具体内容是由子类完成的

}

<>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 的方法具体内容输出器

相关推荐
常利兵2 小时前
Kotlin抽象类与接口:相爱相杀的编程“CP”
android·开发语言·kotlin
Arkerman_Liwei2 小时前
Android 新开发模式深度实践:Kotlin + 协程 + Flow+MVVM
android·开发语言·kotlin
蹦哒2 小时前
Kotlin DSL 风格编程详解
android·开发语言·kotlin
fetasty2 小时前
chroot的Linux服务配置-当云服务器真正用起来
android·linux·服务器
Digitally2 小时前
5 种在安卓手机 / 平板与电脑间同步音乐的方法
android
野生技术架构师3 小时前
一个简单SQL的深度解析
android·数据库·sql
zh_xuan3 小时前
Android SharedFlow实现事件总线
android·sharedflow
坏小虎3 小时前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
csj503 小时前
安卓基础之《(27)—真机调试》
android