我在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实例在视图中被实例化并且也将被销毁)?
根据我从文档中理解的内容,我应该在每次实例化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都将被销毁。
“每次实例化ViewModel(使用前面的代码)的视图都被销毁时,我应该删除观察者,对吧?”
如果你使用qazxsw poi观察ViewModel中的qazxsw poi:
LiveData
,因此您应该处理删除观察者的位置。如果你使用observeForever(observer)
观察视图中的onCleared()
“但是一旦视图被销毁,观察者不应该被销毁(因为ViewModel实例在视图中被实例化并且也将被销毁)?”
这个问题更像是一个Java问题,而不是Android。
想想“被摧毁”意味着什么。当Android框架销毁View或ViewModel时,并不意味着该对象已从内存中完全删除。只要有其他对象(例如观察者)引用它们,您的活动和片段就不会被垃圾收集。
如果你调用LiveData
,那么Android框架可以跟踪observe(lifecyclerowner, observer)
实例和observe(activity, observer)
实例之间的连接,因此当它想要杀死activity
时它可以杀死observer
。但是,如果你只是调用observer
,那么Android框架根本无法告诉这个观察者属于哪个对象。