簡體   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