对我的项目的根本介绍

  • 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的应用,比拟繁琐且无聊。

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

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

结尾

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

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