我在删除封闭中创建的实时数据观察器时遇到问题。
观察者是这样创建的:
recordingListener.startRecording() {ID ->
this.ID = ID
locationViewModel.getAllByID(ID).observe(this, android.arch.lifecycle.Observer {locations ->
myViewService.showDataOnMap(locations!!)
})
}
我正尝试将其删除:
locationViewModel.getAllByID(ID).removeObservers(this)
但是,即使在调用removeObserver之后,观察者似乎仍然存在。我的想法是问题是由观察者是在闭包内部创建的事实引起的,否则我可能做错了其他事情。
答案 0 :(得分:0)
问题出在随后对locationViewModel的调用中,我正在使用相同的ID进行更多调用。这样可以防止locationViewModel Observer被删除。
要解决该问题,我现在在对locationViewModel的后续调用中使用LiveData扩展ObserveOnce。它所做的只是使管理只需要一个响应的ViewModel调用变得容易一些。
我不能说这是否是最佳实践,它的需求可能源于我的应用程序中的不良体系结构,但是对于它来说,它的工作原理和工作原理非常好,所以在快乐的日子里,这是“观察一次”代码: / p>
fun <T> LiveData<T>.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer<T>) {
observeForever(object : Observer<T> {
override fun onChanged(t: T?) {
observer.onChanged(t)
removeObserver(this)
}
})
}
我这样称呼它:
locationViewModel.getAllByID(ID).observeOnce(this, Observer {locations ->
})