当应用程序处于后台时,flowWithLifecycle(lifecycle, Lifecycle.State.STARTED) 不会停止流程

Orc*_*say 6 android kotlin kotlin-coroutines kotlin-flow kotlin-stateflow

我正在尝试观察View Collection 和上游流量已停止的结果。但当viewModel.testFlow应用程序在后台时仍在收集。为什么我看不到收集已停止?我观察到了什么错误吗?

视图模型:

val testFlow = flow<Int> {
    for (i in 1..100) {
        delay(1000)
        Timber.e("testFlow: EMIT = $i")
        emit(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

活动:

override fun onViewCreated() {
        lifecycleScope.launch {
            viewModel.testFlow
                .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
                .collect {
                    Timber.d("testFlow: $it Collected")
                }
        }
}

override fun onActivityPaused(activity: Activity) {
    super.onActivityPaused(activity)
    Timber.e("testFlow: onActivityPaused")
}
Run Code Online (Sandbox Code Playgroud)

日志 生命周期图

https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda

Ser*_*gey 3

您正在使用Lifecycle.State.STARTED状态来开始观察,当发射停止时Flow对应的方法是。如果调用的方法,发射和收集将停止。ActivityonStop()onStop()Activity

如果您想在onPause调用方法时停止发出和收集数据,可以使用Lifecycle.State.RESUMED状态。

当应用程序进入后台时,调用onStop()方法并且使用状态来观察时,您应该看到发射和收集停止。ActivityLifecycle.State.STARTEDFlow