作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试提前取消流程时,我注意到一个奇怪的行为。看一下下面的示例。
这是一个发出整数值的简单流程
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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!