Android数据缓存框架 - 内存缓存与数据的发布订阅

经过多年的努力,我的数据缓存框架github.com/dora4/dcach... ,已经很完善了,然而还有一个场景需要考虑。那就是被多处引用的数据,比如用户个人资料、金融app的各个账户的余额,以及任何很多界面共用的数据,都需要有一个数据同步的机制。即在各个界面中,一处发生修改,另外关联的地方全部要即时刷新。

什么时候使用内存缓存?

这就引入了我们今天的话题:内存缓存。其实熟悉本框架的读者应该知道,repository本身包含了承载数据的载体,LiveDataStateFlow,而本框架中的repository又是继承自ViewModel的,所以正常按使用ViewModel的方式使用repository就好了。by viewModelsby activityViewModels,一个activity或fragment中可以有多种repository。同样的,一种repository也可以被不同的activity或fragment使用。本质上,你所有地方都去调用repository的重新拉取最新数据也是没有任何毛病的。但是repository毕竟相对来说还是有点重量级的,这时我们可以考虑轻量级的解决方法。通过使用全局的内存缓存,然后通过订阅数据发布者来获取最新数据的更新。这在非activity和fragment的类,比如view或adapter以及dialog中使用的比较多。

代码如何实现

内存缓存

kotlin 复制代码
DataPublisher.DEFAULT.getLastValue(YourModel::class.java)

因为repository在开启了数据通知功能,即配置@Repository@ListRepository注解的时候,配置了isNotify属性为true。这时repository在获取数据的时候就会同时发送数据变更的通知给所有订阅者了。如果为列表数据,你可以使用ListDataPublisherListDataSubscriber,使用方式类似,这里就不过多赘述。

kotlin 复制代码
DataPublisher.DEFAULT.clearLastValue(YourModel::class.java)

清除内存缓存使用clearLastValue

数据的发布订阅

数据发布
kotlin 复制代码
DataPublisher.DEFAULT.send(YourModel::class.java, yourData)
数据的订阅与取消订阅
数据订阅
kotlin 复制代码
DataSubscriber.getInstance(YourModel::class.java).subscribe(object : DataPublisher<YourModel> {
    override fun recieve(isDeterminate: Boolean, modelType: Class<*>, liveData: MutableLiveData<*>) {
        if (modelType.isAssignableFrom(YourModel::class.java) && !isDeterminate) {
            // 这里接收到了数据的变更,处理liveData的观察逻辑
        }
    }
})
数据取消订阅
kotlin 复制代码
DataSubscriber.getInstance(YourModel::class.java).unsubscribe(object : DataPublisher<YourModel> {
    override fun recieve(isDeterminate: Boolean, modelType: Class<*>, liveData: MutableLiveData<*>) {
        if (modelType.isAssignableFrom(YourModel::class.java) && isDeterminate) {
            // 这里接收到了数据的终止事件,处理liveData的取消观察逻辑
        }
    }
})

这里只是伪代码,实际使用时,取消订阅的对象与订阅时的对象是同一个对象。

默认发布者解析

数据发布者都有一个静态属性DEFAULT,所有的数据发布者可以通过调用send方法,发送数据给该类型数据的所有订阅者,不包括自己。而默认发布者其实只多了一个步骤,发送后将数据缓存到HashMap中,如果你要更新内存缓存,则使用默认发布者发布一个新值即可。否则你只需要使用新创建的数据发布者发送数据即可。

写到最后

作者不易,如果想学习更多Android领域的技术,可以follow我的github,github.com/dora4 ,祝你Android学习路上一路顺风顺水,永无BUG。

相关推荐
云手机管家36 分钟前
账号风控突破:云手机设备指纹篡改检测与反制技术解析
android·运维·网络协议·网络安全·智能手机·矩阵·自动化
千里马-horse1 小时前
Detected for tasks ‘compileDebugJavaWithJavac‘ (17) and ‘kspDebugKotlin‘ (21).
android·jdk·kspdebugkotlin
Yvonne爱编码2 小时前
CSS- 2.1 实战之图文混排、表格、表单
前端·css·html·github·状态模式·html5·hbuilder
柯南二号3 小时前
【Android】Android 实现一个依赖注入的注解
android
archko5 小时前
语音识别-3,添加ai问答
android·人工智能
flex888810 小时前
FramePack - 开源 AI 视频生成工具
人工智能·开源·音视频
奔跑吧 android11 小时前
【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SGSIT/SERR/BV-01-C】
android·pts·aosp·pbap·sgsit
qianmoQ11 小时前
GitHub 趋势日报 (2025年05月11日)
github
struggle202511 小时前
AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。
人工智能·开源·自动化
Panesle11 小时前
阿里开源通义万相Wan2.1-VACE-14B:用于视频创建和编辑的一体化模型
人工智能·开源·大模型·文生视频·多模态·生成模型