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

Some of the multiple concurrent calls to set LiveData are not observed

我有拨打网络电话的功能。可以同时调用多次,每次调用并发运行。

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 个并发调用同时开始,然后它们尝试 post 它们的结果,但未观察到其中 1 或 2 个结果。我该如何解决这个问题?任何帮助将不胜感激。

我认为这个问题是由于 LiveData 的性质造成的。 LiveData 是一个 Observable ViewHolder 只会发出它处理的最后一个值。

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

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

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