Корутина: 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 шт):
Если в корутине нет других suspend функций (которые тоже должны быть отменяемыми) и нет проверки на отмену корутины, то её не получится отметить, подробнее тут https://kotlinlang.org/docs/cancellation-and-timeouts.html#making-computation-code-cancellable
Ещё данная проблема может возникать из-за того, что вы ловите CancellationException в try и не перебрасывает его в catch
Ps для задач вроде похода в сеть корутины нужно создавать во ViewModel, а не в фрагменте/активити