当前位置:   article > 正文

android CancellationException 了解

android CancellationException 了解

Android开发中,CancellationException通常是在协程或预期完成的任务被取消时遇到的异常。这种异常是Kotlin协程的一部分,也可以在各种异步任务管理库中找到。

场景

  1. 协程取消:

    • 当你使用job.cancel()scope.cancel()取消一个协程时,会抛出CancellationException。这是协程生命周期管理的正常部分。
  2. 超时:

    • 使用withTimeoutwithTimeoutOrNull时,如果在操作完成之前达到超时时间,会取消协程并抛出CancellationException
  3. 结构化并发:

    • 如果父协程被取消,所有子协程也会被取消,这可能会导致子协程中抛出CancellationException

处理 CancellationException

要有效地处理CancellationException,你可以考虑以下策略:

  • 使用try-catch块:

    • 你可以在try-catch块中捕获CancellationException,以优雅地处理取消。
  1. try {
  2. // 可能被取消的协程或挂起函数
  3. } catch (e: CancellationException) {
  4. // 处理取消,例如清理资源
  5. }
  • 检查取消状态:
  • 在长时间运行的协程中,使用coroutineContext.isActive定期检查取消状态。
  1. while (isActive) {
  2. // 执行一些工作
  3. }
  • 使用finally块:
  • 将清理代码放在finally块中,以确保即使协程被取消也会执行。
  1. try {
  2. // 协程或挂起函数
  3. } finally {
  4. // 清理代码
  5. }

示例

下面是一个如何在协程中处理CancellationException的示例:

  1. import kotlinx.coroutines.*
  2. fun main() = runBlocking {
  3. val job = launch {
  4. try {
  5. repeat(1000) { i ->
  6. println("Job: I'm sleeping $i ...")
  7. delay(500L)
  8. }
  9. } catch (e: CancellationException) {
  10. println("Job was cancelled")
  11. } finally {
  12. println("Job: I'm running finally")
  13. }
  14. }
  15. delay(1300L)
  16. println("main: I'm tired of waiting!")
  17. job.cancelAndJoin() // 取消job并等待其完成
  18. println("main: Now I can quit.")
  19. }

在这个例子中,协程被启动并重复打印消息并延迟。在1300毫秒后,主协程取消了job并等待其完成。CancellationException被捕获,并且finally块确保了清理代码的运行。

最佳实践

  • 资源清理: 始终在finally块或CancellationException的catch块中清理资源。
  • 结构化并发: 使用结构化并发原则有效地管理协程的生命周期。
  • 超时处理: 使用withTimeoutOrNull优雅地处理超时,避免在超时发生时抛出异常。

通过正确理解和处理CancellationException,你可以确保你的Android应用程序中的协程任务被高效且可靠地管理。

---- 文章由 ChatGPT 生成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/747906
推荐阅读
相关标签
  

闽ICP备14008679号