gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:52:30 26 4
gpt4 key购买 nike

我们平时使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com