【发布时间】:2020-04-04 20:55:28
【问题描述】:
Room 在后台线程自动执行返回LiveData 的查询。但我想返回一个未包含在 LiveData 中的单个值(因为我不想要实时更新)。
如何使用协程来实现这一点?
如何从这个函数返回Task 对象?
fun getTask(id: Int): Task {
viewModelScope.launch {
repository.getTask(id)
}
}
这个函数在 ViewModel 中。它将调用转发到 DAO:
@Query("SELECT * FROM task_table WHERE id = :id")
fun getTask(id: Int): Task
【问题讨论】:
-
你不能从协程中同步(立即)返回。他们不是这样工作的。协程是异步的,其数据的消费一直到最终消费者都是异步的。这就是 LiveData 存在的原因 - 使用它,即使您认为它太复杂。
-
@DougStevenson 谢谢你的回答。我不想使用
LiveData的原因是这个值不应该在屏幕上获得实时更新。我想我仍然可以返回LiveData并只阅读一次value,但这似乎不是一个干净的解决方案。毕竟这叫live数据。 -
LiveData 是单一响应的完美解决方案。事实上,文档甚至用它的“资源”模式证实了这一点。
-
好的,谢谢。关于您提到的文档部分,您有可以指向我的链接吗?
-
@Query(...) suspend fun getTask(id: Int): Task,你也可以使用Flow和Room代替LiveData
标签: kotlin android-room android-livedata android-architecture-components kotlin-coroutines