gpt4 book ai didi

android - 如何取消/取消订阅协程 Flow

转载 作者:行者123 更新时间:2023-12-02 17:47:07 27 4
gpt4 key购买 nike

当我尝试提前取消流程时,我注意到一个奇怪的行为。看一下下面的示例。

这是一个发出整数值的简单流程

  private fun createFlow() = flow {
repeat(10000) {
emit(it)
}
}

然后我使用此代码调用 createFlow 函数

  CoroutineScope(Dispatchers.Main).launch {
createFlow().collect {

Log.i("Main", "$it isActive $isActive")
if (it == 2) {
cancel()
}
}
}

这是打印出来的内容

0 isActive true
1 isActive true
2 isActive true
3 isActive false
4 isActive false
etc...etc

现在,我希望流程在达到 2 的值后应该停止发出整数,但实际上它会将 isActive 标志切换为 false 并继续发出,而不会停止。

当我在发射之间添加延迟时,流量的行为符合我的预期。

private fun createFlow() = flow {
repeat(10000) {
delay(500) //add a delay
emit(it)
}
}

这是再次调用流程后打印出来的内容(这是预期的行为)。

0 isActive true
1 isActive true
2 isActive true

如何才能在不增加延迟的情况下精确取消指定值的流量发射?

最佳答案

我在 this 中遇到了一个解决方法相关问题

我已将项目中的每个 collect 替换为 safeCollect 函数:

/**
* Only proceed with the given action if the coroutine has not been cancelled.
* Necessary because Flow.collect receives items even after coroutine was cancelled
* https://github.com/Kotlin/kotlinx.coroutines/issues/1265
*/
suspend inline fun <T> Flow<T>.safeCollect(crossinline action: suspend (T) -> Unit) {
collect {
coroutineContext.ensureActive()
action(it)
}
}

关于android - 如何取消/取消订阅协程 Flow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59680533/

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