为什么Observers作为observeForever添加到LiveData必须删除?

问题描述 投票:0回答:2

我在Android LiveData documentation上读过:

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

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

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

init {
    initObservable()
}

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

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

android android-livedata android-viewmodel android-mvvm
2个回答
0
投票

根据我从文档中理解的内容,我应该在每次实例化ViewModel的视图时删除观察者

要实现这一点,您应该在View(Activity,Fragment)中实例化您的viewmodel并观察像这样的livingata

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
        model.getUsers().observe(this, Observer<List<User>>{ users ->
            // update UI
        })

通过传递this你将观察到的数据绑定到view's生命周期,所以当View(Activity,Fragment)被销毁时,viewmodel和observer都将被销毁。


0
投票

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

如果你使用qazxsw poi观察ViewModel中的qazxsw poi:

  • 你不应该担心View的生命周期,因为它与ViewModel的生活不同。 ViewModel应该能够超越创建它的View。相反,当不需要ViewModel时,框架将调用LiveData,因此您应该处理删除观察者的位置。

如果你使用observeForever(observer)观察视图中的onCleared()

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.