【发布时间】:2021-05-18 18:43:38
【问题描述】:
我已经阅读了几十篇帖子,但不知何故,我的情况似乎没有一个答案。
我想要实现的是在 Fragment 中等待 ViewModel 使用 Room 执行操作。
道:
@Query("SELECT * FROM my_table WHERE id = :id")
suspend fun getMyData(id: Long): List<Item>
在 ViewModel 中我不需要返回任何内容,只需使用数据库中的一些数据更新我的变量。我在这里也尝试过其他方法,即返回 Deferred
视图模型:
suspend fun updateData(myItem: Item) {
for (myField in myItem.fields) {
myField.someOtherField = myDao.getMyData(myField.id)
}
}
我尝试过使用 runBlocking、lifecycleScope.launch 和 async.await() 等待,但总是得到相同的结果。我需要处理更新的项目。
片段:
runBlocking {
val job = launch{
viewModel.updateData(myItem)
}
job.join()
doSomethingElseWithUpdatedmyItem(myItem) //this always executes before viewModel.updateData(myItem) even starts
}
【问题讨论】:
-
您的代码应该可以正常工作。是否涉及其他代码?
-
@LouisWasserman 我没有看到任何相关的内容。唯一想到的是 runBlocking 块位于观察者内部,而 myItem 实际上是从该观察者返回的值。会不会有影响?
标签: android kotlin android-room kotlin-coroutines