【问题标题】:LiveData not updating after database change on WorkerLiveData 在 Worker 上的数据库更改后未更新
【发布时间】:2019-08-01 17:31:07
【问题描述】:

我有一个将一些图像发送到服务器的 Worker。当 Worker 启动时,我需要将视图状态更改为“进行中”,当 Worker 完成时,我需要将视图状态更改为“已完成”。但是,当我更新 Worker 内的 Room Database 时,我的视图无法理解数据库已更改并且 LiveData 未得到通知。 如果我在 Worker 启动之前进行相同的调用,LiveData 会了解更改并更新我的视图。我遇到的问题是我的视图并不确切知道应该更新 recyclerview 的哪个项目,因此我无法观察视图上的 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)

【问题讨论】:

  • 添加您的代码,我们无法在不知道您的代码做什么的情况下帮助您。
  • 我认为我的代码在这种情况下不会改变任何东西。当我在不同的地方使用相同的代码时,它可以工作。
  • 添加相关代码。
  • 已更新代码

标签: java android kotlin android-room android-livedata


【解决方案1】:

UI 只能从 UI 线程(也是主线程)更新,而不能在您正在使用的 Worker 等任何其他线程中更新。在 Worker 线程中使用 runOnUiThread(Runnable action) 方法来运行任何与更新 UI 有关的代码。

【讨论】:

  • 但是如果我使用 runOnUiThread 更新我的数据库,它会崩溃,对吧?
【解决方案2】:

由于您拒绝发布相关代码,因此不确定您遇到了什么问题,但我怀疑您正在更改工作线程内的 livedata。如果是这种情况,您需要通过调用其 postValue() 方法来通知 livedata 它已更改。

【讨论】:

  • 我不是拒绝发布我的代码,但我的代码在这里发布有点复杂。我有一个 UI 可以观察从房间数据库获取结果的 LiveData。我有一个更新数据库的 Worker。我不能在那里 postValue,因为 Room 应该这样做。
  • 他正在更新数据库,他不应该调用 postValue()
【解决方案3】:

我遇到了同样的问题。

我发现如果我们运行 room-db @RawQuery,那么 liveData 或 kotlin 流不会得到更新。

所以,我们必须使用普通的@Update 查询而不是@RawQuery。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多