android - 将有状态存储库注入 WorkManager Worker
问题描述
这主要是一个应用程序架构问题。我有一个存储库类,用于集中对媒体集合的操作:
interface MediaRepository {
suspend fun getTracks(): List<Track>
suspend fun getAlbums(): List<Album>
fun observeMediaChanges(): Flow<ChangeNotification>
}
该存储库从多个 DAO 源中提取数据,这些源公开其数据Flow
以观察如下变化:
interface MediaDao {
fun getTracks(): Flow<List<Track>>
fun getAlbums(): Flow<List<Album>>
}
因此, 的实现是有状态的:它从第一次调用等效函数时MediaRepository
就懒惰地观察 s 的变化,每当收到时缓存最新接收到的值,然后计算并将 a 广播给 的观察者。Flow
getX
ChangeNotification
observeMediaChanges()
这种结构在Repository
仅注入 a时运行良好Service
,因为在服务终止时可以清理存储库资源。我现在需要将相同MediaRepository
的注入到Worker
. 由于工人有自己的生命周期,我需要做MediaRepository
一个单例。
问题
通过在应用程序的整个生命周期中保持活动订阅,我是否会泄漏有价值的资源(例如,一个 DAO 内部使用ContentObserver
s)?如何更改我的应用架构以避免泄漏?
我想到了什么
- 使
MediaRepository
无状态并将媒体列表公开为Flow
s。然后,消费者有责任缓存最新的值。 - 将缓存保留在 中
MediaRepository
,但不要在服务和工作人员之间共享实例。 - 根本不要使用缓存,因为大多数数据都是从设备的存储中读取的。
解决方案
推荐阅读
- javascript - 对象的变量在事件处理程序中未定义
- windows - 验证 SSL 证书
- mysql - GROUP_CONCAT() 内的 CONCAT() 计数
- php - 有没有办法用 mysqli 演示 SQL 注入?
- python - 您如何在 tkinter 中拉伸条目以适应屏幕?
- matlab - MATLAB GUI 句柄
- angularjs - 可调整大小处理撤消重做功能中的重复问题
- azure - 存储文件以从 Service Fabric 应用程序流式传输的最快方法?
- mysql - 为外键约束添加或添加约束
- java - 不同端口上的多个 Spring Boot 实例 - 登录/注销问题