android - 如何修复 Kotlin JobCancellationException?
问题描述
由于 Kotlin JobCancellationException,我遇到了崩溃。
以下是有关崩溃的详细信息:
kotlinx.coroutines.JobCancellationException: Job was cancelled; job=SupervisorJobImpl{Cancelling}@131dbe3
我所知道的是SupervisorJobImpl是用于 ViewModelScope 的,当 ViewModel 生命周期结束时,它将被称为方法取消。
我对异常感到非常困惑,因为 Kotlin 协程只会忽略异常,但它被抛出并导致应用程序崩溃。如果它有堆栈,我可以弄清楚,但它没有,只是告诉我工作被取消了。
我花了大约 3 天的时间处理异常,但只是不知道。
我看了视频: KotlinConf 2019:协程!需要把他们全都抓到!通过 Florina Muntenescu 和 Manuel Vivo,我发现如果范围被取消,并且如果您在 Deferred 上调用await,它将抛出异常,但我发现取消范围上没有await。
那么有人可以向我展示一些可能导致相同异常并使应用程序崩溃的代码吗?谢谢,那里。
解决方案
最后,我找到了导致异常的原因,并且问题地址正在流动:
kotlin.coroutines.channels.awaitClose: JobCancellationException
实际上,awaitClose
不会抛出JobCancellationException
, 因为awaitClose
是一个可取消的挂起函数。如果 Job 因为不是可取消的挂起函数而被取消,该offer
方法将抛出。JobCancellationException
offer
顺便说一下,callbackFlow
是一个实验性的API,所以可能会引起一些bug,所以我们在使用的时候需要小心。因为它不会总是忽略JobCancellationException
Job 被取消的时候,而且我认为它对开发者不友好。
现在我发现了两种会导致的情况,JobCancellationException
所以我们需要try catch
例外。
async await
,当我们调用await
我们需要的方法时try catch
。您可以在视频中找到示例。callbackFlow offer
,当我们调用offer
我们需要的方法时try catch
。你可以在上面的问题中找到一个例子。
推荐阅读
- ansible - 如何将用户定义的环境变量存储在 ansible 变量中?
- laravel - “在 null 上调用成员函数 store()”Laravel 如何修复
- python - Matplotlib:文本显示错误
- azure - AzCopy 身份验证:租户中不存在所选用户帐户
- json - 如何访问 REST API 返回的日期值格式的数据?
- database - 从db填充golang嵌套结构的方法
- javascript - 在反应中丢失页面刷新时的组件数据
- php - 创建一个没有属性的空 Laravel 模型实例,但仍然获取 id
- wordpress - BuddyPress 待处理页面上的 WordPress 用户验证(插件)状态
- flutter - 在 Dart 文件之间进行 Flutter 导航