android - 为什么生成 LiveData 或 Flow 的函数不必从 CoroutineScope 调用?

标签 android android-room kotlin-coroutines android-livedata kotlin-flow

我们平时使用 Room 的时候,我们使用 Kotlin Coroutine 并做一个 DAO 来访问 Room 并得到结果。大多数功能通常有suspend函数开头的修饰符但 LiveDataFlow .
例如,让我们看一下下面的这两个代码。

@Query("SELECT * FROM MockTable")
suspend fun allMockDataWithSuspend(): List<MockData>

@Query("SELECT * FROM MockTable")
fun allMockData(): Flow<List<MockData>> // or LiveData<List<MockData>>
当我们使用 suspend修饰符,我们需要在协程范围内调用该函数,因为该函数具有挂起修饰符。但是当函数的结果为LiveData时,我们不需要在协程中调用函数或 Flow即使它是 I/O 访问。
这怎么可能?

最佳答案

你读过Flow documentation ?它在那里非常详细地解释了它。
基本上(据我所知,我自己并没有长时间使用它们)你的挂起函数返回一个 List ,即一口气获得所有结果。如果生成该结果列表可能需要一些时间,请添加 suspend关键字来表示。然后通过调用该函数在协程中异步获取列表。Flow s 是不同的——它们的重点是在任意时间提供结果,并且可能永远不会停止!数据项在它们发出时都会被传递,而不是在一个集合中一次全部传递。
因此,当您创建 Flow ,你实际上还没有做任何工作。这就是为什么你的函数不是 suspend一,它只是创建对象。要真正获得元素,您需要调用 collect在它上面,这需要在协程中发生,因为那是异步事情实际发生的地方。

关于android - 为什么生成 LiveData 或 Flow 的函数不必从 CoroutineScope 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68750552/

相关文章:

android - 如何在android中的工具栏添加 Action 搜索图标

java - @Update 在 Android Room 中如何工作?

android - 如何使 kapt gradle 任务显示 Kotlin 代码中的错误而不是生成的 Java 代码?

android - TCP 问题 - 读取服务器响应时挂起

java - Android - 如何在每次打开应用程序时启动完全相同的 Activity ?

带有 Kotlin Flow toList() 的 Android Room 库不起作用

android - Kotlin 结构化并发 [协程] 模型是否适用于适合数据库写入的 UI?

kotlin - 为什么线程表现出比协程更好的性能?

java - 将应用程序与 spring 社交网站集成

sqlite - session 室数据库迁移失败 : ALTER TABLE to add multiple columns