我有一个函数来进行网络调用。它可以在同一时间被多次调用,而且每次调用都会同时运行。
getDataTask() // it is subscribed on the background thread and observed on the main thread
.subscribe(
{ result -> onResult(result) },
{ onError() }
)
.addToDisposables()
我能够顺利检索数据。onResult
函数更新 MutableLiveData
领域中 ViewModel
作为
private val _data = MutableLiveData<Data>()
val data: LiveData<Data> get() = _data
private fun onResult(result: Data) = _data.post(result)
而该场馆将在观察。Fragment
's onViewCreated
方法为
viewModel.data.observe(viewLifecycleOwner, Observer { data -> // DO SOMETHING })
当背靠背的并发调用成功并尝试更新了 _data
领域,我注意到观察者没有观察到一些结果。例如,有4个并发的调用同时开始,然后他们试图发布他们的结果,有1或2个结果没有被观察到。如何解决这个问题?任何帮助都将被感激。
我认为问题的发生是由于以下性质的原因 LiveData
. LiveData
作为 Observable ViewHolder
只会发出它处理的最后一个值。
现在我明白你是在做并发调用,这没有错。如果你想在网络中节省执行时间,那么这就是你要做的事情。然而,如果你想让这种并发性与你的 LiveData
例如,你希望你的 LiveData
以在并发方法成功返回时立即发出它处理的每一个值,那么你可能会使用 LiveData
错。
你要找的是 LiveData's Observable nature
. 你得到的是 lifecycle aware
捆绑了免费的部分,但它又不是普通的 Observable
但一个特殊的只保留最后一个值。
在你的情况下,如果你想处理每一个值,你最好是使用 RxJava's Observable
. 你也可以通过以下方式使其具有生命周期意识 subscribing & unsubscribing
在你 activity or fragment
. 你有这么多的运营商在 RxJava
他们中的一个一定会帮助你,夫妇,我能想到的是。switchMap
和 Map
.