![](/img/trans.png)
[英]Android Kotlin "withTimeout" coroutine how to handle exception
[英]How to work withTimeout in Coroutine on Android
在我的应用程序中,我想使用Coroutines
,我编写了简单的代码来检查withTimeout
函数!
我写了下面的代码,我想在3 秒后停止工作并向我显示完成消息!
但是在3 秒后停止协程但没有显示完成消息!
我的代码:
CoroutineScope(Default).launch {
Log.e(TAG, "Start coroutine")
withTimeout(3000) {
for (i in 20..50) {
if (isActive) {
delay(500)
Log.e(TAG, "Show i => $i")
}
}
}
Log.e(TAG, "Done coroutine")
}
Logcat 消息:
2022-02-05 18:08:11.891 12413-12484/my.app.coroutines E/CoroutinesTag: Start coroutine
2022-02-05 18:08:12.399 12413-12484/my.app.coroutines E/CoroutinesTag: Show i => 20
2022-02-05 18:08:12.900 12413-12485/my.app.coroutines E/CoroutinesTag: Show i => 21
2022-02-05 18:08:13.404 12413-12491/my.app.coroutines E/CoroutinesTag: Show i => 22
2022-02-05 18:08:13.905 12413-12486/my.app.coroutines E/CoroutinesTag: Show i => 23
2022-02-05 18:08:14.406 12413-12491/my.app.coroutines E/CoroutinesTag: Show i => 24
为什么不显示完成(完成协程)消息?
withTimeout
的说明
在具有指定超时 timeMillis 的协程内运行给定的暂停代码块,如果超过超时,则抛出 TimeoutCancellationException。
TimeoutCancellationException 扩展了 CancellationException 用于退出构建器 function 就像优雅地launch
一样。 如果您不希望您的工作完成,您可以使用withTimeoutOrNull
并且来自官方文档
withTimeout 抛出的 TimeoutCancellationException 是 CancellationException 的子类。 我们之前没有在控制台上看到它的堆栈跟踪。 那是因为在取消的协程内部 CancellationException 被认为是协程完成的正常原因。 然而,在这个例子中,我们在主 function 中使用了 withTimeout。
由于取消只是一个例外,所有资源都以通常的方式关闭。 如果您需要专门针对任何类型的超时执行一些额外的操作,或者使用类似于withTimeout 但在超时时返回 null 而不是抛出异常:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.