[英]Some of the multiple concurrent calls to set LiveData are not observed
我有一個 function 可以撥打網絡電話。 可以同時調用多次,每次調用並發運行。
getDataTask() // it is subscribed on the background thread and observed on the main thread
.subscribe(
{ result -> onResult(result) },
{ onError() }
)
.addToDisposables()
我能夠毫無問題地檢索數據。 onResult
function 將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
只會發出它處理的最后一個值。
現在我知道你正在做並發呼叫,這沒有錯。 如果您想在網絡中節省執行時間,那么這就是 go 的方法。 但是,如果您希望此並發與您的LiveData
實例一起使用,並且您希望您的LiveData
在並發方法成功返回后立即發出它處理的每個值,那么您可能會錯誤地使用LiveData
。
您正在尋找的是LiveData's Observable nature
。 你可以免費獲得lifecycle aware
部分,但它又不是你的常規Observable
,而是一個只保留最后一個值的特殊部分。
在您想要處理每個值的情況下,最好使用RxJava's Observable
。 您也可以通過在您的activity or fragment
中subscribing & unsubscribing
來使其具有生命周期意識。 你在RxJava
中有這么多運算符,其中一個肯定會幫助你,我認為是switchMap
和Map
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.