Корутина: cancel() не останавливает корутину

Коррутина не останавливается черзе cancel().

Что я делаю:

  • захожу во фрагмента. в нем есть кнопка, которая отправляет сетевой запрос. после получения ответа - надо обработать View на основе ответа.
  • это код обернут в Коррутину
  • нажимаю на кнопку
  • через прогармму Фидлер я торможу отправку запроса / получения ответа
  • ухожу с Фрагмента
  • в onDestroy Фрагмента я выключаю Коррутину
  • спускаю Фидлер с цепи (отправляю запрос или получаю ответ)

код:

private var testScope = MainScope()

...............

fcc_next?.setOnClickListener {  
    testScope.launch {
        Log.e("!!!", "поехали!! ")
        viewModel.getAll()
        Log.e("!!!", "а я все еще рабтаю! ")
    }

}

......................

override fun onDestroy() {
    super.onDestroy()
    testScope.cancel()
    Log.e("!!!", "Дестрой")
}

что показывает Лог:

2021-10-26 14:03:02.881 17716-17716/ E/!!!: поехали!! 
2021-10-26 14:03:07.804 17716-17716/ E/!!!: Дестрой
2021-10-26 14:03:12.927 17716-17716/ E/!!!: а я все еще рабтаю!

14:03:02 - я нажал кнопку, Фидлер блокировал запрос
14:03:07 - я ушел с фрагмента. сработал onDestroy, а значит и сработал testScope.cancel()
14:03:12 - отпускаю Фидлер. видно, что не сработал cancel


Ответы (1 шт):

Автор решения: IR42

Если в корутине нет других suspend функций (которые тоже должны быть отменяемыми) и нет проверки на отмену корутины, то её не получится отметить, подробнее тут https://kotlinlang.org/docs/cancellation-and-timeouts.html#making-computation-code-cancellable

Ещё данная проблема может возникать из-за того, что вы ловите CancellationException в try и не перебрасывает его в catch

Ps для задач вроде похода в сеть корутины нужно создавать во ViewModel, а не в фрагменте/активити

→ Ссылка