最近,我将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 = [email protected]()
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) {
[email protected]()
}
onSuccess(result)
} catch (e: Exception) {
onFailed(e.message)
}
}
}
例如:
我的片段在协程期间销毁并称为
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
? 最佳答案
您尝试改为捕获父类(super class)CancellationException
,这是公共(public)API的一部分。
请注意,如果有东西抛出CancellationException
,通常应将其重新抛出,以便通知上游对象有关取消的信息。参见Cancellation is Cooperative