【发布时间】:2020-04-04 08:41:30
【问题描述】:
文字A和代码A来自这个article。
我很奇怪他们为什么不使用代码 B 或代码 C 来实例化用户对象。我觉得 Code B 和 Code C 非常简单明了。
顺便说一句,我没有测试过代码 B 和代码 C,但我认为它们是正确的。
文字A
使用 LiveData 时,您可能需要异步计算值。例如,您可能想要检索用户的偏好并将它们提供给您的 UI。在这些情况下,您可以使用 liveData 构建器函数调用挂起函数,将结果作为 LiveData 对象提供。 在下面的示例中,loadUser() 是在别处声明的挂起函数。使用 liveData builder 函数异步调用 loadUser(),然后使用 emit() 发出结果
代码 A
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
代码 B
val user: LiveData<User> = MutableLiveData<User>(database.loadUser())
代码 C
val user = MutableLiveData<User>(database.loadUser())
【问题讨论】:
-
你知道什么是挂起函数和协程吗?您不能使用代码 B 和代码 C,因为
loadUser是挂起函数,但liveData {...}创建CoroutineLiveData在协程中通过挂起 lamda 运行 -
因为这是suspend lambda,所以可以在里面使用其他的suspend函数
标签: android kotlin kotlin-coroutines android-ktx