部分设置LiveData的多个并发调用没有被观察到。

问题描述 投票:0回答:1

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

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个结果没有被观察到。如何解决这个问题?任何帮助都将被感激。

android kotlin android-livedata android-viewmodel mutablelivedata
1个回答
1
投票

我认为问题的发生是由于以下性质的原因 LiveData. LiveData 作为 Observable ViewHolder 只会发出它处理的最后一个值。

现在我明白你是在做并发调用,这没有错。如果你想在网络中节省执行时间,那么这就是你要做的事情。然而,如果你想让这种并发性与你的 LiveData 例如,你希望你的 LiveData 以在并发方法成功返回时立即发出它处理的每一个值,那么你可能会使用 LiveData 错。

你要找的是 LiveData's Observable nature. 你得到的是 lifecycle aware 捆绑了免费的部分,但它又不是普通的 Observable但一个特殊的只保留最后一个值。

在你的情况下,如果你想处理每一个值,你最好是使用 RxJava's Observable. 你也可以通过以下方式使其具有生命周期意识 subscribing & unsubscribing 在你 activity or fragment. 你有这么多的运营商在 RxJava 他们中的一个一定会帮助你,夫妇,我能想到的是。switchMapMap.

© www.soinside.com 2019 - 2024. All rights reserved.