当我尝试提前取消流程时,我注意到一个奇怪的行为。看一下下面的例子。
这是一个发出整数值的简单流程
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
如何才能在不增加延迟的情况下精确取消指定值的流量发射?