我遵循Android Room with a View - Kotlin中列出的架构模式。我的应用程序显示N个堆栈,并且这些堆栈中的每个堆栈都可以显示为有盖或无盖。堆栈数可以在运行时更改。关于机盖是否关闭的信息不是永久性的,当它改变时,我必须在用户界面中做出反应。因此,我考虑将其设置为LiveData对象。
class ContentRepository(private val contentDao: ContentDao) {
val allStacks : LiveData<List<Stack>> = contentDao.getStacks()
val showCover = HashMap<Int, LiveData<Boolean>>()
init {
allStacks.observeForever { stacks ->
stacks.filter { !showCover.containsKey(it.number) }
.map { showCover.put(
it.number,
MutableLiveData<Boolean>(false)) }
}
}
}
鉴于我没有从存储库中访问LifeCycleOwner的权限,我可以在此处使用observeForever,还是会导致数据泄漏?
答案 0 :(得分:2)
如果存储库与应用程序具有相同的生命周期,并且仅创建了一个实例,则应该没问题。否则,您最终将泄漏存储库。
您应该考虑使用map
的{{1}}扩展功能将内容映射到新的LiveData
而不需要观察它,而不是公开LiveData
公开Map<Int, LiveData<Boolean>>
我不知道此解决方案是否适用于您的用例。但是,如果您找到一种使用LiveData<Map<Int, Boolean>>
函数而不是永远观察的方法,它将使您的代码更加健壮。
答案 1 :(得分:1)
在这种情况下,应使用“转换”。例如:
val allStacks : LiveData<List<Stack>> = contentDao.getStacks()
private val mShowCover = HashMap<Int, Boolean>()
val showCover = Transformations.map(allStacks) { stacks ->
stacks.filter { !mShowCover.containsKey(it.number) }
.map { mShowCover.put(
it.number,
false
)
}
mShowCover
}