android - Kotlin 流程 WhileSubscribed
问题描述
我正在研究 Android 上的 Kotlin 流,它的一些行为对我来说似乎很奇怪。该WhileSubscribed
策略并不总是按预期工作。例如:
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
val instantFlow = flow {
while (true) {
emit(Instant.now())
delay(Duration.ofMinutes(1).toMillis())
}
}
.onStart { Log.d(TAG, "instantFlow -start") }
.onCompletion { Log.d(TAG, "instantFlow -completion") }
.shareIn(
scope,
SharingStarted.WhileSubscribed(
Duration.ofSeconds(4).toMillis(),
Duration.ZERO.toMillis(),
),
1,
)
val eventFlow = flow {
for (i in 0..9) {
emit(i)
delay(Duration.ofSeconds(1).toMillis())
}
}
.onEach { Log.d(TAG, "$it ${instantFlow.first()}") }
.launchIn(scope)
在此示例中,仅在完成后才instantFlow
完成 ( ) ,但是,如果您更改为,则将完成并重新开始,而不刷新新订阅。如果以热流的形式出现,也会出现同样的问题:onCompletion
eventFlow
Dispatchers.Main.immediate
Dispatchers.Main
instantFlow
stopTimeoutMillis
eventFlow
private val eventFlow = MutableSharedFlow<Event?>(
0,
Int.MAX_VALUE,
BufferOverflow.SUSPEND,
)
eventFlow
.onEach { Log.d(TAG, "$it ${instantFlow.first()}") }
.launchIn(scope)
在这种情况下,即使使用Dispatchers.Main.immediate
,instantFlow
也将不断重新启动,而不会刷新stopTimeoutMillis
来自 的新事件eventFlow
。我对 kotlin 协程几乎没有经验,我可能做错了什么。如果这是如何工作的,我怎样才能像第一个例子一样WhileSubscribed
创建一个具有预期行为的行为?MutableSharedFlow
解决方案
推荐阅读
- javascript - 如何验证反应选择
- ios - 如果用户已授予麦克风访问权限,则无法通过蓝牙收听 iOS 应用程序
- javascript - 如何将网页表单中的输入发送到不同网站的搜索栏?
- excel - 使用 VBA 抓取带有登录页面的网站
- java - Java 内存优化 [Key:Long, Value:Long] 存储非常大(500M),用于并发读取访问
- python - 如何重写存储在 .mtx 文件中的节点 ID
- android - MLKit 是否可以检测物体的 3D 尺寸?
- angular - FlexLayoutModule 不适用于 Angular 11
- c++ - 如何在 QSerialPort 打开的串口中设置低延迟
- botframework - 使用 Microsoft Bot Framework 测试包模拟自适应卡片输入