android - 如何阻止 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
方法。
关于如何解决这个问题的任何想法?或者甚至如何收集更多关于发生地点/原因的信息?我自己无法重现它,但它在现场发生了很多。
解决方案
无法销毁活动是告诉您 onDestory 方法无法完成。
由 kotlinx.coroutines.JobCancellationException 引起:作业被取消是告诉您您正在与作业进行交互,但不应该是因为它已被取消。
而不是使用SupervisorJob.cancelChildren()
你应该依赖于结构化并发,而不是。这意味着您的每个作业都应该从您的活动或片段被销毁时取消的范围启动。
推荐阅读
- android-studio - 即使尝试了所有方法,我也无法安装 HAXM
- ruby-on-rails - Rails 中的嵌套 AREL 和/或查询
- c# - 在 .NET 中使用任务并行库定位特定的 CPU 内核?
- ios - 合并两个视频
- javascript - 字符串不应包含两个连续的正斜杠且不以正斜杠“/”结尾
- java - 如何关闭 Selenium 打开的所有 Chrome 窗口
- r - 如何对可能包含可变字符的模式应用回溯正则表达式?
- java - 在 id 中使用 ognl 表达式的变量不显示值
- python - 多个编辑文件无需更改'.DS_Store'
- racket - 什么时候应该使用不精确的数字前缀 (#i)?