如何阻止CoroutineCancellationException导致活动未完成?

时间:2019-05-24 17:57:08

标签: android kotlin crashlytics kotlin-coroutines

我在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 :(得分:0)

无法破坏活动告诉您onDestory方法无法完成。

由kotlinx.coroutines.JobCancellationException引起:作业已取消告诉您您正在与作业进行交互,但不应该是因为作业已取消。

您应该依靠structured concurrency而不是使用SupervisorJob.cancelChildren()。意思是您的每一项工作都应该在销毁活动或片段时取消的范围内启动。