首页 > 解决方案 > 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完成 ( ) ,但是,如果您更改为,则将完成并重新开始,而不刷新新订阅。如果以热流的形式出现,也会出现同样的问题:onCompletioneventFlowDispatchers.Main.immediateDispatchers.MaininstantFlowstopTimeoutMilliseventFlow

private val eventFlow = MutableSharedFlow<Event?>(
    0,
    Int.MAX_VALUE,
    BufferOverflow.SUSPEND,
)

    eventFlow
        .onEach { Log.d(TAG, "$it ${instantFlow.first()}") }
        .launchIn(scope)

在这种情况下,即使使用Dispatchers.Main.immediateinstantFlow也将不断重新启动,而不会刷新stopTimeoutMillis来自 的新事件eventFlow。我对 kotlin 协程几乎没有经验,我可能做错了什么。如果这是如何工作的,我怎样才能像第一个例子一样WhileSubscribed创建一个具有预期行为的行为?MutableSharedFlow

标签: androidkotlinkotlin-flow

解决方案


推荐阅读