删除实时数据观察一个封闭的内部创建

问题描述 投票:1回答:1

我有一个去除瓶盖内产生的实时数据观察的问题。

观察者创建就像这样:

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被称为后还是一样。我的想法是,这个问题是由观察者是一个封闭的内部创建的,否则也许我做别的错误造成的事实。

android mvvm kotlin android-livedata android-viewmodel
1个回答
0
投票

这个问题在后续调用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 ->

})
© www.soinside.com 2019 - 2024. All rights reserved.