簡體   English   中英

未觀察到設置 LiveData 的多個並發調用中的一些

[英]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)

並且該字段設置為在FragmentonViewCreated方法中觀察為

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 fragmentsubscribing & unsubscribing來使其具有生命周期意識。 你在RxJava中有這么多運算符,其中一個肯定會幫助你,我認為是switchMapMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM