未观察到设置LiveData的多个并发调用中的一些调用



我有一个函数可以进行网络调用。它可以同时被调用多次,每次调用都同时运行。

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)

并且该场被设置为在FragmentonViewCreated方法中被观察为

viewModel.data.observe(viewLifecycleOwner, Observer { data -> // DO SOMETHING })

当背靠背并发调用成功并尝试更新_data字段时,我注意到观察者没有观察到一些结果。例如,有4个并发调用同时启动,然后它们试图发布结果,但其中1或2个结果未被观察到。我该如何解决这个问题?如有任何帮助,我们将不胜感激。

我认为问题的出现是由于LiveData的性质LiveDataObservable ViewHolder将只发出它处理的最后一个值。

现在我知道您正在进行并发调用,这并没有错。如果你想在网络中节省执行时间,那么这就是你的选择。但是,如果您希望此并发性与LiveData实例一起使用,并且希望LiveData在并发方法成功返回后立即发出它处理的每个值,那么您可能使用了错误的LiveData

您想要的是LiveData's Observable nature。您可以免费获得与其捆绑在一起的lifecycle aware部件,但它不是常规的Observable,而是一个只保留最后一个值的特殊部件。

在您想要处理每个值的情况下,最好使用RxJava's Observable。您也可以通过activity or fragment中的subscribing & unsubscribing使其具有生命周期意识。您在RxJava中有这么多运算符,其中一个运算符肯定会对您有所帮助,我认为这两个运算符是switchMapMap

相关内容

  • 没有找到相关文章

最新更新