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

Ana*_*ula 11 android android-mvvm android-livedata android-viewmodel

我在Android LiveData 文档中阅读了以下内容

您可以使用 observeForever(Observer) 方法注册一个没有关联 LifecycleOwner 对象的观察者。在这种情况下,观察者被视为始终处于活动状态,因此始终会收到有关修改的通知。您可以调用 removeObserver(Observer) 方法删除这些观察者。

我正在使用 MVVM 架构模式构建一个应用程序,使用ViewModel并在我的 ViewModel 类中声明 LiveDatas。在我的 viewModel 中,我将 aobserveForever设置为 LiveData:

val password by lazy {
    MutableLiveData<String>()
}

init {
    initObservable()
}

private fun initObservable() {
    password.observeForever {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

San*_*Lee 21

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

如果您LiveDataViewModel 中使用observeForever(observer)以下方法观察 a :

  • 您不必担心 View 的生命周期,因为它与 ViewModel 的生命周期不同。ViewModel 应该能够比创建它的 View 更长寿。相反,框架将onCleared()在不需要 ViewModel 时调用,因此您应该在此处处理移除观察者。

如果你观察LiveData查看使用observe(lifecyclerowner, observer)

  • 当生命周期所有者被销毁时,观察者将被框架自动删除。


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

这个问题比 Android 更像是 Java 问题。

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

如果调用observe(activity, observer),那么Android Framework 可以跟踪activity实例和observer实例之间的连接,因此它可以observer在想要杀死时杀死activity。但是,如果您只是调用observeForever(observer),Android 框架根本无法判断此观察者属于哪个对象。