gpt4 book ai didi

android - 删除在闭包内创建的实时数据 Observer

转载 作者:行者123 更新时间:2023-11-29 02:22:26 25 4
gpt4 key购买 nike

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

Observer 是这样创建的:

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 Observer 被移除。

为了解决这个问题,我现在在对 locationViewModel 的后续调用中使用 LiveData 扩展 ObserveOnce。它所做的只是让管理对只需要一个响应的 ViewModel 的调用变得更容易一些。

我不能说它是否是最佳实践,它的需要可能源于我的应用程序中糟糕的架构,但为此它工作并且工作得很好所以快乐的日子,这里是 Observe once 代码:

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

})

关于android - 删除在闭包内创建的实时数据 Observer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54539831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com