我一直在尝试将coroutine应用到我的android应用中,但发现async coroutine有一些奇怪的地方。基于这个 文章
val deferred = async { … }
deferred.cancel()
val result = deferred.await() // throws JobCancellationException!
如果你在 await 代码被调用之前取消了 deferred,它就会抛出异常。好像就是不允许你取消一个异步coroutine。如何取消deferred而不产生异常?
或者唯一的方法就是在每个 await 周围加上 try-catch?但这在我看来很啰嗦。有什么更简洁的方法吗?
调用 await()
之后 cancel()
导致 CancellationException
. 来自 文件 的 await()
方法。
这个暂停功能是可以取消的。如果 工作内容 在这个暂停函数等待期间,当前的coroutine被取消或完成,这个函数立即恢复,并在这个暂停函数等待期间,在这个暂停函数等待期间,当前的coroutine被取消或完成。
CancellationException
.
CancellationException
被 "无声 "地抛出 不崩溃,我们可以从 文件:
如果出现异常
CancellationException
那么它就会被忽略(因为这就是所谓的取消运行中的coroutine的机制)。
如果你想以某种方式处理异常,清理资源,或者希望你的代码在调用了 await()
使用 try-catch
块照旧。
val deferred = async { ... }
deferred.cancel()
try {
val result = deferred.await()
} catch (e: CancellationException) {
// handle CancellationException if need
} finally {
// make some cleanup if need
}
// ... other code which will be executed if `await()` throws `CancellationException`