我可以在 Kotlin 中使用 MutableLiveData 直接实例化用户对象吗?

Can I instantiate a user object directly using MutableLiveData in Kotlin?

正文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 方法处理此代码时,您正在调用 MutableLiveData() 构造函数,这是一个普通的旧构造函数调用,这意味着它以阻塞方式同步执行。当您传递对它的调用时,例如 database.loadUser(),将首先评估该表达式(同样,阻塞和同步,在同一线程上),然后将其结果传递给构造函数。

问题在于,如果您在整个构造函数调用以及传递给它的任何内容中都在主线程上,那么在加载数据期间您将阻塞整个线程。

协程允许您通过挂起函数释放当前线程。但是,您不能只是混合和匹配阻塞和挂起函数,因为那没有意义。相反,您必须在协同程序中调用挂起函数。

liveData 构建器函数可让您创建一个 LiveData 实例,并使用协程向其提供数据,异步,能够调用挂起函数,比如例子中的loadUser(),可以是挂起函数。因此,创建此 LiveData 将是快速且非阻塞的,而您在该构建器中定义的协程可以异步执行,并在完成加载后使用 emit() 将结果设置在 LiveData 中.