流程 - 暂停/恢复流程

时间:2021-03-15 13:06:43

标签: kotlin flow kotlin-flow

在 RxJava 中,valve 运算符允许暂停(和缓冲)流并再次恢复流(并且在恢复后立即发出缓冲值)。它是 rx java 扩展 (https://github.com/akarnokd/RxJavaExtensions/blob/3.x/src/main/java/hu/akarnokd/rxjava3/operators/FlowableValve.java) 的一部分。

kotlin 流程有类似的东西吗?

我的用例是,我想观察 Activity 中的流并且永远不会丢失事件(就像我用 LiveData 来做的那样,例如,如果 Activity 暂停,它会停止观察数据)。因此,当活动暂停时,我希望流缓冲观察到的值,直到活动恢复并在活动恢复后立即发出它们。

因此,在创建活动时(直到它被销毁),我想观察流程,但我只想在活动处于活动状态时发出值,并在活动不活动时(但仍创建)缓冲这些值,直到它得到再次活跃。

有什么东西可以解决这个问题,或者有没有人写过一些东西来解决这个问题?

2 个答案:

答案 0 :(得分:0)

Lifecycle.launchWhenXSharedFlow 的组合应该可以解决问题。下面是一个简单的例子,它使用每秒发出一个数字的流。

// In your ViewModel
class MainViewModel : ViewModel() {
    val numbers = flow {
        var counter = 0
        while (true) {
            emit(counter++)
            delay(1_000L)
        }
    }
        .shareIn(
            scope = viewModelScope,
            started = SharingStarted.Lazily
        )
}
// In your Fragment.onViewCreated()
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
    viewModel.numbers
        .collect { number ->
            Log.d("asdf", "number: $number")
        }
}

这是有效的,因为当 Lifecycle.launchWhenStarted 进入停止状态时,Lifecycle 会暂停协程,而不是取消它。当您的 Lifecycle 在暂停后恢复到开始状态时,它会收集处于停止状态时发生的所有事情。

答案 1 :(得分:-1)

您可以使用 lifecycleScope.launchWhenStarted https://developer.android.com/kotlin/flow/stateflow-and-sharedflow#stateflow