由于Kotlin JobCancellationException,我当机了。
以下是有关崩溃的详细信息:
kotlinx.coroutines.JobCancellationException: Job was cancelled; job=SupervisorJobImpl{Cancelling}@131dbe3
我所知道的是 SupervisorJobImpl 用于ViewModelScope,当ViewModel生命周期结束时,它将称为方法取消。
我对异常非常困惑,因为Kotlin协程只会忽略该异常,但是它被抛出并导致App崩溃。如果它有堆栈,我只能弄清楚,但没有,只要告诉我该作业已取消。
我花了大约3天以上的时间来异常(exception),但是却一无所知。
我看了视频:
KotlinConf 2019: Coroutines! Gotta catch 'em all! by Florina Muntenescu & Manuel Vivo,我发现范围是否被取消,并且如果您在Deferred上调用 await ,它将抛出异常,但在取消的范围上我没有找到 await 。
因此,有人可以告诉我一些可能导致相同异常并导致App崩溃的代码吗? Thx,在那里。
最佳答案
最后,我找到了导致异常的原因,并且问题地址不断涌现:
kotlin.coroutines.channels.awaitClose: JobCancellationException
实际上,awaitClose
不会抛出JobCancellationException
,因为awaitClose
是可取消的暂停函数。如果作业被取消,因为offer
不是可取消的暂停函数,则JobCancellationException
方法将抛出offer
。
顺便说一句,callbackFlow
是一个实验性的API,因此可能会导致一些错误,因此在使用它时,我们需要小心。因为取消Job时,它不会总是忽略JobCancellationException
,而且我认为它对开发人员不友好。
现在,我发现了两种情况会导致JobCancellationException
,因此我们需要try catch
异常。
async await
,当我们调用await
方法时,我们需要try catch
。您可以在Video中找到示例。 callbackFlow offer
,当我们调用offer
方法时,我们需要try catch
。您可以在上面的问题中找到一个示例。