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