首页 > 解决方案 > 如何阻止 CoroutineCancellationException 导致活动无法完成?

问题描述

我在 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方法。

关于如何解决这个问题的任何想法?或者甚至如何收集更多关于发生地点/原因的信息?我自己无法重现它,但它在现场发生了很多。

标签: androidkotlincrashlyticskotlin-coroutines

解决方案


无法销毁活动是告诉您 onDestory 方法无法完成。

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

而不是使用SupervisorJob.cancelChildren()你应该依赖于结构化并发,而不是。这意味着您的每个作业都应该从您的活动或片段被销毁时取消的范围启动。


推荐阅读