我有一个去除瓶盖内产生的实时数据观察的问题。
观察者创建就像这样:
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被称为后还是一样。我的想法是,这个问题是由观察者是一个封闭的内部创建的,否则也许我做别的错误造成的事实。
这个问题在后续调用locationViewModel我多打几个电话相同的ID。这防止了观察者locationViewModel被移除。
为了解决这个问题,现在我使用的是LiveData扩展ObserveOnce,在后续调用locationViewModel。它所做的只是让管理呼叫到只需要一个响应更容易一点的视图模型。
我不能说它是否是最好的做法还是没有,它可能需要从坏架构梗在我的应用程序,但对于这一点,工作和运作良好如此幸福的日子,这里是观察一次代码:
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 ->
})