android CancellationException 了解

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

场景

  1. 协程取消:

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

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

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

处理 CancellationException

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

  • 使用try-catch块:

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

示例

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

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {
            repeat(1000) { i ->
                println("Job: I'm sleeping $i ...")
                delay(500L)
            }
        } catch (e: CancellationException) {
            println("Job was cancelled")
        } finally {
            println("Job: I'm running finally")
        }
    }

    delay(1300L)
    println("main: I'm tired of waiting!")
    job.cancelAndJoin() // 取消job并等待其完成
    println("main: Now I can quit.")
}

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

最佳实践

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

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

---- 文章由 ChatGPT 生成

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃饱很舒服

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值