我有一个函数可以进行网络调用。它可以同时被调用多次,每次调用都同时运行。
getDataTask() // it is subscribed on the background thread and observed on the main thread
.subscribe(
{ result -> onResult(result) },
{ onError() }
)
.addToDisposables()
我能够毫无问题地检索数据。onResult
函数将ViewModel
中的MutableLiveData
字段更新为
private val _data = MutableLiveData<Data>()
val data: LiveData<Data> get() = _data
private fun onResult(result: Data) = _data.post(result)
并且该场被设置为在Fragment
的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
。您也可以通过activity or fragment
中的subscribing & unsubscribing
使其具有生命周期意识。您在RxJava
中有这么多运算符,其中一个运算符肯定会对您有所帮助,我认为这两个运算符是switchMap
和Map
。