簡體   English   中英

在 Worker 上更改數據庫后,LiveData 未更新

[英]LiveData not updating after database change on Worker

我有一個 Worker 將一些圖像發送到服務器。 當 Worker 啟動時,我需要將我的視圖狀態更改為“進行中”,當 Worker 完成時,我需要將我的視圖狀態更改為“已完成”。 但是,當我更新 Worker 內部的Room 數據庫時,我的視圖無法理解數據庫已更改並且未通知LiveData 如果我在 Worker 啟動之前進行相同的調用, LiveData 會了解更改並更新我的視圖。 我遇到的問題是我的視圖並不確切知道它應該更新回收視圖的哪個項目,所以我無法觀察視圖上的 Worker。 我需要在 Worker 內部進行此更新。

--- 更新代碼 ---

分段

viewModel.shortHistoryViewModelList.observe(viewLifecycleOwner, Observer { 
        binding.viewModel = viewModel
        adapter.replace(shortHistories)
        binding.executePendingBindings()
        scrollToItem(shortHistories)
})

視圖模型

private val results: MediatorLiveData<List<ShortHistory>> = MediatorLiveData()
init {
    this.state.value = NetworkStateEnum.NONE
    results.addSource(repository.get()) {
        results.postValue(it)
    }
}

val shortHistoryViewModelList: LiveData<List<ShortHistoryViewModel>> =
        Transformations.switchMap(results) { shortHistories ->
            val mutableLiveData: MutableLiveData<List<ShortHistoryViewModel>> = MutableLiveData()
            val list = ArrayList<ShortHistoryViewModel>()

            for (shortHistory in shortHistories) {
                list.add(ShortHistoryViewModel(shortHistory))
            }
            mutableLiveData.value = list
            mutableLiveData
        }

工人

val shortHistory = shortHistoryRepository.get(shipmentId)
shortHistory.digitalReceipt = shortHistory.digitalReceipt?.copy(status = DigitalReceiptStatusEnum.Sending.value)
shortHistoryRepository.insert(shortHistory)

UI 只能從 UI 線程(也是主線程)更新,而不能在任何其他線程(如您正在使用的Worker中更新。 在 Worker 線程中使用runOnUiThread(Runnable action)方法來運行任何與更新 UI 相關的代碼。

由於您拒絕發布相關代碼,因此不確定您遇到了什么問題,但我懷疑您正在更改工作線程內的實時數據。 如果是這種情況,您需要通過調用它的 postValue() 方法來通知 livedata 它已更改。

我遇到了同樣的問題。

我發現如果我們運行 room-db @RawQuery,那么 liveData 或 kotlin 流不會更新。

所以,我們必須使用普通的@Update 查詢而不是@RawQuery。

暫無
暫無

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

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