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

Android 为什么必须删除作为ObserveForver添加到LiveData的观察者?,android,android-livedata,android-viewmodel,android-mvvm,Android,Android Livedata,Android Viewmodel,Android Mvvm,我已经读到: 您可以使用observeforver(observer)方法注册没有关联LifecycleOwner对象的观察者。在这种情况下,观察者被视为始终处于活动状态,因此始终会收到有关修改的通知。您可以通过调用removeObserver(Observer)方法删除这些观察者 我正在使用MVVM架构模式构建一个应用程序,在我的ViewModel类中使用并声明LiveData。在我的viewModel中,我已将一个observeForever设置为一个LiveData: val passwo

我已经读到:

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

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

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

init {
    initObservable()
}

private fun initObservable() {
    password.observeForever {
        ...
    }
}
valpasswordby lazy{
MutableLiveData()
}
初始化{
initObservable()
}
可观察的私人娱乐(){
password.observeforver{
...
}
}
根据我从文档中了解到的情况,每次实例化ViewModel(使用前面的代码)的视图被销毁时,我都应该删除observer,对吗?但是,一旦视图被销毁,观察者不应该被销毁吗(因为ViewModel实例在视图中被实例化,并且也将被销毁)

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

要实现这一点,您应该在视图(活动、片段)中实例化viewmodel,并像这样观察livedata

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
        model.getUsers().observe(this, Observer<List<User>>{ users ->
            // update UI
        })
val model=ViewModelProviders.of(this.get)(MyViewModel::class.java)
model.getUsers().observe(这个,obsers{users->
//更新用户界面
})
通过传递
可以将观察livedata与
视图的
生命周期联系起来,因此当视图(活动、片段)被销毁时,viewmodel和observer都将被销毁。

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

如果您正在
ViewModel中使用
observeforver(observer)
观察
LiveData

  • 您不应该担心视图的生命周期,因为它不同于ViewModel的生命周期。ViewModel应该能够超出创建它的视图。相反,当不需要ViewModel时,框架将调用
    onCleared()
    ,因此您应该在这里处理删除观察者的问题
如果使用
observe(lifecyclerowner,observer)在视图中观察
LiveData

  • 当lifecycleowner被销毁时,框架将自动删除观察者

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

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

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


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

在一个视图模型中实现Sanlok Lee的答案,看起来是这样的:

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

private val passwordObserver = Observer<String> {
    ...
}

init {
    initObservable()
}

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

override fun onCleared() {
    password.removeObserver(passwordObserver)
    super.onCleared()
}
valpasswordby lazy{
MutableLiveData()
}
private val passwordObserver=Observer{
...
}
初始化{
initObservable()
}
可观察的私人娱乐(){
password.observeforver(passwordObserver)
}
覆盖有趣的onCleared(){
password.removeObserver(passwordObserver)
super.onCleared()
}

您是如何获得这个
ViewModel
实例的?为什么从
ViewModel
本身观察
password