Горячий исправить Kotlin JobCancellationException? - PullRequest
1 голос
/ 04 мая 2020

У меня есть cra * sh из-за Kotlin JobCancellationException.

Ниже приводится подробная информация о cra * sh:

kotlinx.coroutines.JobCancellationException: Job was cancelled; job=SupervisorJobImpl{Cancelling}@131dbe3     

Все, что я знаю, это SupervisorJobImpl предназначен для ViewModelScope, и он будет называться методом cancel , когда жизненный цикл ViewModel закончится.

Я был так смущен этим Исключением, потому что Kotlin сопрограммы будут просто игнорировать Исключение, но оно было брошено и вызывает приложение cra sh. Если у него есть стек, я могу просто выяснить, но это не так, просто скажите мне, что работа была отменена.

Я потратил на исключение более 3 дней, но просто понятия не имею.

Я видел видео: KotlinConf 2019: сопрограммы! Должен поймать их всех! Флорина Мунтенеску и Мануэль Виво , я обнаружил, что прицел отменен, и если вы позвоните await для Отложенного, он выдаст Исключение, но я не нашел ожидание в отмененной области.

Так может кто-то просто показать мне какой-нибудь код, который, возможно, вызывает то же исключение, и сделать приложение cra sh? Спасибо.

1 Ответ

0 голосов
/ 06 мая 2020

Наконец, я обнаружил, что вызывает исключение, и адрес проблемы течет:

kotlin .coroutines.channels.awaitClose: JobCancellationException

На самом деле, awaitClose не будет выбрасывать JobCancellationException, потому что awaitClose является отменяемой приостановленной функцией. Метод offer выдаст JobCancellationException, если задание было отменено, поскольку offer не является отменяемой приостановленной функцией.

Кстати, callbackFlow - экспериментальный API, поэтому он может вызвать некоторую ошибку Поэтому, когда мы используем его, мы должны быть осторожны. Потому что он не всегда будет игнорировать JobCancellationException, когда Job был отменен, и я не думаю, что это дружелюбно для разработчиков.

Теперь я обнаружил 2 ситуации, которые приведут к JobCancellationException, поэтому нам нужно try catch исключение.

  1. async await, когда мы вызываем метод await, нам нужно try catch. И вы можете найти и пример в Video .

  2. callbackFlow offer, когда мы вызываем метод offer, нам нужно try catch. И вы можете найти пример в выпуске выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...