最近,我将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
?
你尝试捕获超类CancellationException
,这是公共API的一部分。
请注意,如果某些东西抛出CancellationException
,通常需要重新抛出它,以便上游对象收到有关取消的通知。见Cancellation is Cooperative