首页 > 解决方案 > 如何修复 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

那么有人可以向我展示一些可能导致相同异常并使应用程序崩溃的代码吗?谢谢,那里。

标签: androidkotlin

解决方案


最后,我找到了导致异常的原因,并且问题地址正在流动:

kotlin.coroutines.channels.awaitClose: JobCancellationException

实际上,awaitClose不会抛出JobCancellationException, 因为awaitClose是一个可取消的挂起函数。如果 Job 因为不是可取消的挂起函数而被取消,该offer方法将抛出。JobCancellationExceptionoffer

顺便说一下,callbackFlow是一个实验性的API,所以可能会引起一些bug,所以我们在使用的时候需要小心。因为它不会总是忽略JobCancellationExceptionJob 被取消的时候,而且我认为它对开发者不友好。

现在我发现了两种会导致的情况,JobCancellationException所以我们需要try catch例外。

  1. async await,当我们调用await我们需要的方法时try catch您可以在视频中找到示例。

  2. callbackFlow offer,当我们调用offer我们需要的方法时try catch。你可以在上面的问题中找到一个例子。


推荐阅读