Kotlin协程流程未取消

时间:2020-09-17 11:09:11

标签: kotlin kotlin-coroutines android-viewmodel kotlin-flow

我有一个UseCase类,其方法返回Flow

fun startTimeTicker(startTime: Long) = flow {
    val countdownStart = System.currentTimeMillis()
    for (currentTime in countdownStart..startTime step ONE_SECOND_MILLIS) {
        .... irrelevant ...
        emit("Some String")
        delay(ONE_SECOND_MILLIS)
    }
}

我正在这样收集ViewModel中的发射日期

private fun startCollecting(startTime: Long) = launch {
    matchStartTimerUseCase.startTimeTicker(startTime).collect {
        _startTimeCountdown.postValue(it)
    }
}

,我的片段正在观察LiveData并显示值。直到我离开屏幕之前,它都按预期工作。由于launch是用ViewModel的coroutineScope调用的,它不应该被取消并且不再发出值吗?

ViewModel的范围是在BaseViewModel中实现的,我的ViewModel从中扩展如下:

抽象类BaseViewModel( 私有val dispatcherProvider:DispatcherProvider ):ViewModel(),CoroutineScope {

override val coroutineContext: CoroutineContext
    get() = job + dispatcherProvider.provideUIContext()

private val job = SupervisorJob()

override fun onCleared() {
    super.onCleared()
    job.cancel()
}

}

我是忘记添加一些自定义取消逻辑还是缺少其他内容吗?

1 个答案:

答案 0 :(得分:1)

如果范围是ViewModel是Activity的生命周期ViewModelProvider(requireActivity()).get(YOUR_VIEWMODEL::class.java),那么除非您的Activity被销毁,否则不会调用onCleared,但不会更改旋转。

首先,确保已调用onCleared(),如果未调用,则可以将其称为Fragment或Activity的任何生命周期方法。