Kotlin Coroutine如何取消async await()

问题描述 投票:1回答:1

我一直在尝试将coroutine应用到我的android应用中,但发现async coroutine有一些奇怪的地方。基于这个 文章

val deferred = async { … }
deferred.cancel()
val result = deferred.await() // throws JobCancellationException!

如果你在 await 代码被调用之前取消了 deferred,它就会抛出异常。好像就是不允许你取消一个异步coroutine。如何取消deferred而不产生异常?

或者唯一的方法就是在每个 await 周围加上 try-catch?但这在我看来很啰嗦。有什么更简洁的方法吗?

kotlin async-await coroutine
1个回答
0
投票

调用 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`
© www.soinside.com 2019 - 2024. All rights reserved.