job.cancel не останавливает тяжёлый цикл
В отчётном экране считается большая агрегация:
val job = scope.launch(Dispatchers.Default) {
var sum = 0L
for (i in 0..2_000_000_000L) {
sum += heavyStep(i) // обычная функция, не приостанавливающая
}
_state.value = Result(sum)
}
// пользователь ушёл с экрана
job.cancel()
Что произойдёт после вызова отмены?
- Цикл доработает до конца: отмена кооперативная, а тело без точек приостановки её не проверяет
- Отмена не сработает, потому что корутина запущена на диспетчере для вычислений: его задачи прерывать нельзя
- Цикл прервётся немедленно: отмена останавливает выполнение корутины на текущей инструкции
- Корутина упадёт с исключением отмены где-то в середине цикла, и результат в состояние записан не будет
