我可以在我的存储库中安全地使用observerForever吗?

时间:2019-05-27 10:17:50

标签: android kotlin android-room android-livedata

我遵循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,还是会导致数据泄漏?

2 个答案:

答案 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 
}