轻松缓存 Android + Kotlin + Flow
创始人
2025-05-31 22:30:36

轻松缓存 Android + Kotlin + Flow

flow-cache

技术背景

在某些情况下,良好的缓存机制可以帮助您作为开发人员并提高应用程序的质量。让我简要介绍一下其中的 2 个,然后介绍简单的解决方案。

案例1
假设您正在开发一个具有几个屏幕和多个 API 调用的 Android 应用程序。随着时间的推移,具有后台逻辑的屏幕和组件越来越多。因此,一段时间后我们几乎同时在应用程序中发生 2 个或更多类似 API GET 的调用是很常见的。有时它会发生在敏感的地方,比如应用程序启动。

对用户意味着什么?显然这是额外的加载时间和电池使用量。

案例2
您正在实现一项需要网络或数据库请求才能显示某些信息的功能。可能是配置文件数据或操作历史记录。您正在考虑如何处理可能的加载错误。通常你会显示一些错误信息。也许您甚至会显示重试按钮。但是,如果用户遇到网络连接问题怎么办?有时最好同时显示一些过时的信息(如灰色)和前面提到的选项。

案例N
我相信您可以想象更多的情况,当易于使用的缓存可以改进您的应用程序并节省您的精力时。

缓存实现概述

通用缓存
因此,让我介绍一下经过一些迭代后我满意的方式。我想实现一些核心原则。

便于使用
只需用几行代码包装您的数据流,然后像往常一样或以高级方式使用它。它会将结果自动缓存到内存或您自定义的任何地方。

val cachedSource = CachedSource(source = { params -> api.getSomething(params) }
)

还有一些默认参数需要根据实际需求进行调整

class CachedSource

(source: suspend (params: P) -> T,private val cache: Cache = MemoryCache(1),private val timeProvider: TimeProvider = SystemTimeProvider,private val dispatcher: CoroutineDispatcher = Dispatchers.IO, )

获取CachedSource中的Flow:

cachedSource.get("params", FromCache.IF_HAVE, maxAge = 5_000).collect {// Use received values}

持续的请求共享

Ongoing request sharing
可选。通常我们可以假设不需要额外的并行请求。但有时仍然需要在不与正在进行的请求共享的情况下提出专门的请求,以确保我们获得最新信息。

此外,我们不仅需要根据数据来源来区分请求,还需要根据请求的确切参数来区分请求。
所以你可以共享来自“…endpoint1/?param=A” 的数据,但是不要共享来自“…endpoint1/?param=B”的数据。

suspend fun get(...shareOngoingRequest: Boolean = true,...
): Flow =

不同的请求选项

基本上,当您加载信息时,您可能需要几个主要行为:

  • 始终从真实请求中获取数据。从不从缓存中获取
  • 从真实请求中获取,但如果失败则使用缓存
  • 从缓存中获取,但如果没有合适的缓存则使用真实请求
  • 仅从缓存中获取(如果为空则出错)
  • 从缓存中获取(快速)然后从真实请求中获取(长)
enum class FromCache {NEVER,IF_FAILED,IF_HAVE,ONLY,CACHED_THEN_LOAD,
}

从结果中获取与缓存相关的信息

所以你总是可以检查它是来自缓存的数据还是刚刚加载的数据。如果来自缓存,它有多大。根据此信息,您可以根据需要手动切换到新请求。因此,您可以根据需要进一步自定义生成的流程。

data class CachedSourceResult(val value: T,val fromCache: Boolean,val originTimeStamp: Long?,
)

其他

当然还有一些其他有用的功能,例如重置缓存或侦听(通过 Flow)任何更新的能力。如果你想实现一些不常见的行为,你也可以以flatMap 的方式组合流。

例如,这里有一个扩展,用于检查自定义条件的缓存并在没有缓存或条件未通过时启动真正的请求:

suspend fun 

CachedSource.getOrRequest(params: P,fromCachePredicate: (cached: CachedSourceResult) -> Boolean, ): Flow =flow {getRaw(params, FromCache.IF_HAVE).collect {if (!it.fromCache || fromCachePredicate(it)) {emit(it.value)} else {emitAll(getRaw(params, FromCache.NEVER).map { result -> result.value })}}}

像下面的方式发起调用:

source .getOrRequest( "param" , fromCachePredicate = { it.someData.isNotEmpty() }) .collect { ... }

最后,附上github相关实现的代码:

https://github.com/Andrew0000/Universal-Cache

相关内容

热门资讯

蚊子包怎么快速消肿,蚊子叮咬怎... 蚊子包怎么快速消肿目录蚊子包怎么快速消肿蚊子叮咬怎么办?这些方法很管用蚊子叮咬后,别着急!试试这些小...
毒上三种发货的区别,毒上的普通... 毒上三种发货的区别目录毒上三种发货的区别毒上的普通发货,极速发货,闪电发货的区别是啥什么?普通发货有...
x光片属于什么垃圾,x光片扔了... x光片属于什么垃圾目录x光片属于什么垃圾x光片扔了有讲究吗感光胶片属于什么垃圾分类?撕掉的旧照片属于...
万字的笔画名称是什么,万字的笔... 万字的笔画名称是什么目录万字的笔画名称是什么万字的笔顺笔画顺序万字的笔画名称万字笔画怎么读万字的笔画...
国产登山包那个品牌好?强氧,穿... 本篇文章极速百科给大家谈谈国产登山包那个品牌好?强氧,穿越怎么样,以及国内品牌登山包对应的知识点,希...
路虎揽胜试驾(2024款路虎揽... 本篇文章极速百科给大家谈谈路虎揽胜试驾,以及2024款路虎揽胜试驾对应的知识点,希望对各位有所帮助,...
法兰琳卡会员积分兑换礼品上新啦... 今天给各位分享法兰琳卡会员积分兑换礼品上新啦!的知识,其中也会对法兰琳卡能用吗进行解释,如果能碰巧解...
奥迪A3奥迪A3最新报价-图片... 今天给各位分享奥迪A3奥迪A3最新报价-图片-参数的知识,其中也会对奥迪a3l新车报价2020款图片...
北京奔驰glk300质量怎么样... 今天给各位分享北京奔驰glk300质量怎么样的知识,其中也会对北京奔驰glk200进行解释,如果能碰...
椰子鸡火锅的做法有哪些步骤,大... 椰子鸡火锅的做法有哪些步骤目录椰子鸡火锅的做法有哪些步骤大学生必学的椰子鸡火锅家庭版椰子鸡火锅怎么做...
满堂架搭设验收规范是什么,满堂... 满堂架搭设验收规范是什么目录满堂架搭设验收规范是什么满堂脚手架搭设规范房建满堂架和模板问题满堂脚手架...
雪佛兰是哪个汽车公司旗下的品牌... 今天给各位分享雪佛兰是哪个汽车公司旗下的品牌?雪佛兰旗下品牌有...的知识,其中也会对雪佛兰属于什么...
乒乓球是什么时候从小球变大的,... 乒乓球是什么时候从小球变大的目录乒乓球是什么时候从小球变大的乒乓球由小球换大球是什么时候什么是乒乓球...
药石是什么,药石是什么意思? ... 药石是什么目录药石是什么药石是什么意思?什么是cytokine,它的具体概念是什么药石之言是什么意思...
想念的意思,想念是什么意思? ... 想念的意思目录想念的意思想念是什么意思?思念什么意思概括说明想念的含义想念的意思 想念的释义是...
绝地求生设置怎么调,这配置为什... 绝地求生设置怎么调目录绝地求生设置怎么调这配置为什么玩绝地求生还是会卡?要怎么调画面才适合?绝地求生...
带有杰字的成语 极速百科网 极... 带有杰字的成语目录带有杰字的成语带有杰字的成语 英雄豪杰、识时务者为俊杰、人杰地灵、女中豪杰、...
鲸的种类(鲸的种类很多总的来说... 今天给各位分享鲸的种类的知识,其中也会对鲸的种类很多总的来说可以分两类进行解释,如果能碰巧解决你现在...
U盘的成本价格是多少?(u盘的... 今天给各位分享U盘的成本价格是多少?的知识,其中也会对u盘的价钱一般多少进行解释,如果能碰巧解决你现...
1.0奥拓真实油耗多少(铃木奥... 今天给各位分享1.0奥拓真实油耗多少的知识,其中也会对铃木奥拓10手动挡油耗进行解释,如果能碰巧解决...
长城哈弗m4报价及图片(长城哈... 本篇文章极速百科给大家谈谈长城哈弗m4报价及图片,以及长城哈弗h4新车报价2021款对应的知识点,希...
历史中诸葛亮一共几次北伐曹魏,... 历史中诸葛亮一共几次北伐曹魏目录历史中诸葛亮一共几次北伐曹魏诸葛亮北伐几次三国演义中诸葛亮六次北伐分...
卤水的做法及配方,卤料的配方大... 卤水的做法及配方目录卤水的做法及配方卤料的配方大全?卤水的制作?卤菜的卤汁怎么做?卤水的做法及配方 ...
VC是什么,vc是什么? 极速... VC是什么目录VC是什么vc是什么?VC指什么?vc是什么意思?VC是什么 VC是风险投资(V...
半妖倾城的结局是什么,半妖倾城... 半妖倾城的结局是什么目录半妖倾城的结局是什么半妖倾城结局是be吗电视剧(半妖倾城)结局是什么?半妖倾...
排除通用新君越6T40E自动变... 今天给各位分享排除通用新君越6T40E自动变速器烧片故障的知识,其中也会对别克君越变速箱维修视频进行...
女生日常的基本化妆都需要哪些东... 女生日常的基本化妆都需要哪些东西目录女生日常的基本化妆都需要哪些东西女生日常的基本化妆都需要哪些东西...
支付宝蚂蚁森林怎么刷能量 极速... 支付宝蚂蚁森林怎么刷能量目录支付宝蚂蚁森林怎么刷能量支付宝蚂蚁森林怎么刷能量 蚂蚁森林是支付宝...
足球禁区是什么意思,足球比赛中... 足球禁区是什么意思目录足球禁区是什么意思足球比赛中的“禁区”是指什么?足球场上大禁区小禁区的含义是什...
说唱里面的time是什么意思哈... 说唱里面的time是什么意思哈目录说唱里面的time是什么意思哈说唱中的time是什么意思Hey S...