如何修复 Kotlin JobCancellationException?

Par*_*ell 16 android kotlin

由于 Kotlin JobCancellationException,我崩溃了。

以下是有关崩溃的详细信息:

kotlinx.coroutines.JobCancellationException: Job was cancelled; job=SupervisorJobImpl{Cancelling}@131dbe3     
Run Code Online (Sandbox Code Playgroud)

我只知道SupervisorJobImpl是用于 ViewModelScope 的,它会在 ViewModel 生命周期结束时调用方法取消

我对异常感到很困惑,因为 Kotlin 协程只会忽略异常,但它被抛出并导致应用程序崩溃。如果它有堆栈,我可以弄清楚,但没有,只需告诉我作业已取消。

我在异常上花了大约 3 天多的时间,但不知道。

我看到了视频: KotlinConf 2019:协程!需要把他们全都抓到!作者:Florina Muntenescu & Manuel Vivo,我发现如果范围被取消,如果你在延迟上调用await,它会抛出异常,但我发现取消的范围没有等待

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

Par*_*ell 9

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

kotlin.coroutines.channels.awaitClose:JobCancellationException

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

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

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

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

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


gau*_*hra 6

我知道我迟到了,但您可以在提供对象之前检查工作状态。像这样

if(isActive) offer(Resource.success(response))
Run Code Online (Sandbox Code Playgroud)

isActive是协程作用域

  • 是的,谢谢。try catch 不是最好的方法,这个更好。 (2认同)

归档时间:

查看次数:

5241 次

最近记录:

4 年,7 月 前