Kotlin Coroutines - правильный способ отменить все сопрограммы, ожидающие выполнения заданий, из ViewModel onCleared в Android - PullRequest
0 голосов
/ 11 апреля 2019

Остановка заданий в onCleared из ViewModel после завершения действия показывает 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()
        }
    }

Inside ViewModel:

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

1 Ответ

2 голосов
/ 11 апреля 2019

Согласно Легким сопрограммам в Android: сообщение в блоге viewModelScope :

viewModelScope способствует структурированному параллелизму , добавляя свойство расширения в класс ViewModel, который автоматически отменяет его дочерние сопрограммы при разрушении ViewModel.

Таким образом, добавив зависимость от androidx.lifecycle:lifecycle-viewmodel-kex:2.1.0-alpha02 (или выше), вы сможете просто использовать viewModelScope, чтобы сделать правильную вещь по умолчанию:

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