Kotlin协程是从Android中的ViewModel的onCleared取消所有协程待处理作业的正确方法

时间:2019-04-11 04:06:40

标签: android kotlin kotlin-android-extensions kotlin-extension kotlin-coroutines

活动完成后,在 ViewModel 的onCleared中

停止作业显示 JobCancellationException:作业被取消并保持应用冻结崩溃:

我在viewModel中的代码:

private val job = SupervisorJob()
private val uiScope = CoroutineScope(Dispatchers.Main + job)

 uiScope.launch {
        try {
            repeat(152212000001) { it ->
                try {
                    Log.d("Timer : ", it)
                    delay(1000)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        } catch (e: CancellationException) {
            e.printStackTrace()
        }
    }

内部ViewModel:

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

1 个答案:

答案 0 :(得分:2)

按照Easy Coroutines in Android: viewModelScope blog post

  

viewModelScope通过向ViewModel类添加structured concurrency来为extension property做出贡献,该类会在销毁ViewModel时自动取消其子协程。

因此,通过添加对androidx.lifecycle:lifecycle-viewmodel-kex:2.1.0-alpha02(或更高版本)的依赖,默认情况下您就可以使用viewModelScope来做正确的事情:

viewModelScope.launch {
    repeat(152212000001) { it ->
        Log.d("Timer : ", it)
        delay(1000)
    }
}