未观察到一些设置 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)
并且该字段设置为在 Fragment
的 onViewCreated
方法中观察为
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
中有这么多运算符,其中一个肯定会帮助你,我认为一对是 switchMap
和 Map
.
我有拨打网络电话的功能。可以同时调用多次,每次调用并发运行。
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 个并发调用同时开始,然后它们尝试 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
中有这么多运算符,其中一个肯定会帮助你,我认为一对是 switchMap
和 Map
.