Как остановить CoroutineCancellationException, чтобы действие не завершалось? - PullRequest
0 голосов
/ 24 мая 2019

Я получаю довольно много фатальных сообщений о сбоях в Crashlytics, которые, кажется, вызваны отменой сопрограммы.И я понятия не имею, как это исправить, и я не смог воспроизвести его.

Ошибка в Crashlytics:

Fatal Exception: java.lang.RuntimeException: Unable to destroy activity {...ui.main.MainActivity}: kotlinx.coroutines.JobCancellationException: Job was cancelled; job=SupervisorJobImpl{Cancelled}@1ad5bcf
       at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4682)
       at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4700)
       at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:39)
       at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:6981)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

и

Caused by kotlinx.coroutines.JobCancellationException: Job was cancelled

Мой MainActivity не SupervisorJob, но все мои Fragment расширяют базовый класс, который имеет SupervisorJob.Базовый фрагмент также вызывает SupervisorJob.cancelChildren() в методе onStop.

Есть идеи, как это решить?Или даже как собрать больше информации о том, где / почему это происходит?Я не смог воспроизвести это сам, но это происходит довольно редко в полевых условиях.

1 Ответ

0 голосов
/ 25 мая 2019

Невозможно уничтожить действие сообщает, что метод onDestory не может завершиться.

Вызвано kotlinx.coroutines.JobCancellationException: задание было отменено сообщает вам, что вы взаимодействуете с заданием, но не должно быть, потому что оно было отменено.

Вместо использования SupervisorJob.cancelChildren() вместо этого следует полагаться на структурированный параллелизм . Это означает, что каждое из ваших заданий должно запускаться из области, которая отменяется, когда ваша деятельность или фрагмент уничтожаются.

...