gpt4 book ai didi

android - 如何忽略 JobCancellationException?

转载 作者:行者123 更新时间:2023-11-29 14:43:03 25 4
gpt4 key购买 nike

最近,我将 Kotlin Coroutines 从实验版升级到 1.1.1,并遇到了新版本中 job.cancel() 工作方式不同的问题。

这是带有实验协程的代码:

fun <R : Any, T : Deferred<R>> T.runAsync(
job: Job,
onSuccess: (result: R) -> Unit,
onFailed: (errorMsg: String?) -> Unit) {
launch(UI, parent = job) {
try {
val result = this@runAsync.await()
onSuccess(result)
} catch (e: Exception) {
onFailed(e.message)
}
}
}

这是 1.1.1:

fun <R : Any, T : Deferred<R>> T.runAsync(
job: Job,
onSuccess: (result: R) -> Unit,
onFailed: (errorMsg: String?) -> Unit) {
GlobalScope.launch(Dispatchers.Main + job) {
try {
val result = withContext(Dispatchers.IO) {
this@runAsync.await()
}
onSuccess(result)
} catch (e: Exception) {
onFailed(e.message)
}
}
}

例如:

我的 fragment 在协程运行期间被销毁并调用了 job.cancel()

在实验性协程中,onSuccess()onFailed() 都不会被调用。

在 1.1.1 中:onFailed() 因为捕获到 JobCancellationException 而被调用

我想到了添加catch (e: JobCancellationException),但这是不可能的:

/**
* @suppress **This an internal API and should not be used from general code.**
*/
internal expect class JobCancellationException(

那么,问题是:如何处理/忽略 JobCancellationException

最佳答案

您 try catch 父类(super class) CancellationException,它是公共(public) API 的一部分。

请注意,如果某事抛出 CancellationException,您通常会重新抛出它,以便上游对象收到有关取消的通知。参见 Cancellation is Cooperative

关于android - 如何忽略 JobCancellationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54870443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com