我们平时使用 Room 的时候,我们使用 Kotlin Coroutine 并做一个 DAO 来访问 Room 并得到结果。大多数功能通常有suspend
函数开头的修饰符但 LiveData
和 Flow
.
例如,让我们看一下下面的这两个代码。
@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/