删除封闭中创建的实时数据观察者

时间:2019-02-05 17:20:08

标签: android mvvm kotlin android-livedata android-viewmodel

我在删除封闭中创建的实时数据观察器时遇到问题。

观察者是这样创建的:

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之后,观察者似乎仍然存在。我的想法是问题是由观察者是在闭包内部创建的事实引起的,否则我可能做错了其他事情。

1 个答案:

答案 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 ->

})