当前位置: 首页 > 知识库问答 >
问题:

为什么必须删除作为observeForever添加到LiveData的观察者?

段干开宇
2023-03-14
val password by lazy {
    MutableLiveData<String>()
}

init {
    initObservable()
}

private fun initObservable() {
    password.observeForever {
        ...
    }
}

根据我在文档中的理解,每次实例化ViewModel的视图(使用前面的代码)被破坏时,我都应该删除观察者,对吗?但是,一旦视图被销毁(因为ViewModel实例在视图中被实例化,也将被销毁),观察者不应该被销毁吗?

共有1个答案

丁钟展
2023-03-14

“每次实例化ViewModel的视图(使用前面的代码)被破坏时,我都应该删除观察者,对吗?”

如果您在ViewModel中使用ObserveForever(观察者)观察LiveData:

  • 您不应该担心视图的生命周期,因为它不同于ViewModel的生命周期。ViewModel应该能够超越创建它的视图。相反,当不需要ViewModel时,框架将调用onClearle(),因此您应该在这里处理删除观察者。
    null

“但是,一旦视图被销毁(因为ViewModel实例在视图中被实例化,也将被销毁),观察者不应该被销毁吗?”

这个问题更像是Java问题,而不是Android问题。

想想“被摧毁”是什么意思。当一个视图或ViewModel被Android框架破坏时,并不意味着该对象被完全从内存中移除。只要有其他对象(如observer)引用您的活动和片段,它们就不会被垃圾收集。

 类似资料:
  • 问题内容: 阅读针对iOS 9的这篇文章后,我知道您不再需要removeObserver。 然而,对于iOS 8的,你需要给 removeObserver 在中的viewController的方法。但我无法理解。如果一个viewController被释放,那么它的DEAD不是吗?为什么我们需要做一个removeObserver。作为观察员就像打电话给永远不会接电话的死者一样 我不明白什么? 问题答

  • 我之所以说怪异,是因为我不明白有人可能会告诉我什么在按预期工作。 我有一个带有LiveData成员的Android ViewModel,我在Main活动中观察到它来切换一些代码功能。LiveData对象在视图模型的构造函数中被分配初始值。 从理论上讲,一切都很好,只是在安装后第一次启动应用程序和随后启动应用程序之间,观察者的行为会发生变化。 在安装后的第一次启动期间,在我设置好观察者之后,它们会立

  • 当项目添加到LiveData列表时,我需要获得一个Observer事件。但据我所知,只有当我用新列表替换旧列表时,事件才会收到。例如,当我执行下一个操作时: 观察者获取事件。但当我将项目添加到值中时,观察者是沉默的。你能给我一些建议吗?

  • 我对的理解是,它将触发观察者对当前数据的状态变化,而不是对一系列历史数据的状态变化。 目前,我有一个,它执行写操作,将非垃圾数据更改为垃圾数据。 我还提供了另一个,它观察被丢弃的数据。 请考虑以下场景。 当前有0个被丢弃的数据。 是当前活动的片段。尚未创建。 添加了%1个废数据。 现在,有%1个被丢弃的数据 我们使用导航抽屉,将替换为。 的观察者将首先接收,其中有0个被丢弃的数据 同样,的观察者将

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?