繁体   English   中英

如何在 Android 上的协程中使用超时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM