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