您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

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

时间:2021-12-08 17:12:18  来源:  作者:网易Leo

对项目的基本介绍

  • 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法
  • 2.用Kotlin的Flow去代替RxJAVA,因为我发现RxJava功能很强大,但是大家都只是在Http层面使用了一下,既然要用Kotlin里面就已经有Flow,那我还不如少添加一个库
  • 3.通过jetpack的Room数据库实现网络请求的存储,缓存策略也用过注解去完成。
  • 4.发起的网络请求是与宿主生命周期绑定的,在网络请求回来之前,宿主已经销毁的话,网络请求也会中断的

基本使用方法

1.先定义接口类

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

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

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

 

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

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

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

 

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

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

 

4.在对应地方通过viewmodel调用

调用接口,传入对应参数

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

 

在合适的地方观察

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

 

Retrofit的封装

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

可以看到apiService是BaseRepository的变量 而我们生成的Repository都是继承BaseRepository的

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

 

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

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

 

而findNeedType方法就会将ConfigRepository对应的ConfigService得到并且返回出去

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

 

所以apiService就相当于这样,好像有点Retrofit的create方法的样子了

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

我们继续进入
HttpProvider.defaultCreate

可以看到newRetrofit(),并且传入了一个HttpConfig,看到这个名字就知道这是Http的配置 接着是newCreate(),接收了我们的接口service类

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

 

首先看看newRetrofit方法

这几行代码就是创建了一个Retrofit对象并且保存起来,最后返回出去。 但是他是怎么和HttpConfig联系起来的呢?

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

 

我们可以看到这里将生成的Retrofit.Builder()传给了HttpConfig的方法build里,我们进去看一看

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

 

可以看到这里就是我们再熟悉不过的Retrofit的配置环节

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

 

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

在看看newCreate()方法

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

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

 

注解的介绍

1.AutoApi

我们从最简单的AutoApi做引子,开始介绍整个注解框架

只要你的接口类方法中使用了这个注解,就会生成suspend方法,非常的简单 接着我们来看看他是怎么实现的

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

 


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生命周期绑定的协程,默认在主线程运行

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

 


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

 

这里不好解释,我直接画图了

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

 

CoroutineDataFetcher { apiService.getData() }.startFetchData()

apiService.getData() 就是发起网络请求,看一下CoroutineDataFetcher

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

 

startFetchData(),就是根据传入的缓存参数,去找到对应的缓存策略发起Http请求的方法,很简单看一看就好

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

 

代码的分析

通过上面分析我们可以知道,你新写一个注解,其实就只需要编写两个类就好了

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

所以我们直接看到AutoFlowApi的这两个类

AutoFlowMethod

可以说和 AtoMethod 一模一样了,都是收集默认参数 不一样的地方就是下面的一些配置

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

 

通过重写 AbsFuncBuilder 的暴露出来的配置方法,去修改方法的配置信息,比如图中的

  • isNullable,方法返回值能否为null
  • isNeedSuspend,方法是否是需要suspend关键字
  • isNeedReturnType,方法是否需要返回值
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架

 

AutoFlowApiFuncBuilder

这个是AutoFlowApi注解最关键的方法了,里面代码比较多,但是也没什么好解释的,就是对kotlinpoet的使用,比较繁琐且无聊。

就是将你要生成的语句写出来,然后变量用规定字符代替

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

 

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

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

 

结尾

其实这个框架写的时候没考虑其全面性和兼容性,就打算先写出来试一试。其实还有很多地方可以修改和扩展。

今天的文章就到这里,感谢您的阅读,有问题可以在评论区留言探讨,期待与大家共同进步。喜欢的话不要忘了三连。大家的支持和认可,是我分享的最大动力。



Tags:Android开发   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  Tags: Android开发  点击:(6)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  Tags: Android开发  点击:(16)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  Tags: Android开发  点击:(21)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  Tags: Android开发  点击:(15)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  Tags: Android开发  点击:(66)  评论:(0)  加入收藏
Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪...【详细内容】
2021-08-12  Tags: Android开发  点击:(104)  评论:(0)  加入收藏
目前市场中使用音视频技术的公司太多了,大到全民观看短视频,小到直播带货,每个国人的用手机的时间也被视频占据着国内的音视频行业可以划分为三类第一类 短视频抖音、快手、微...【详细内容】
2020-12-09  Tags: Android开发  点击:(130)  评论:(0)  加入收藏
一、Android JetPack&mdash;&mdash;Google多么痛的领悟最近好几个小伙伴问我什么是Android JetPack,听说这个包好像有点牛,帅哥你会不?我心想什么鬼!Android JetPack这货不是一...【详细内容】
2020-09-14  Tags: Android开发  点击:(112)  评论:(0)  加入收藏
前言1、软件吃掉世界,而机器学习正吃掉软件在数据爆炸的时代,如何创建「智能系统」成为焦点。这些应用程序内所体现的智能技术,并非是将实用指令添加到代码中,而是可以让软件自...【详细内容】
2020-07-13  Tags: Android开发  点击:(76)  评论:(0)  加入收藏
1、使用优化过的数据容器。在Android framework下,建议使用优化过的数据容器比如:SparseArray,SparseBooleanArray,LongSparseArray。通用的HashMap实现的内存使用率非常的低,...【详细内容】
2020-04-26  Tags: Android开发  点击:(67)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(6)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(7)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(16)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(21)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(26)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id &#39;com.android.library&#39; id &#39;kotlin-android&#39; id &#39;k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(36)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(57)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(51)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条