android CancellationException 了解

server/2024/10/10 20:38:58/

在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 生成


http://www.ppmy.cn/server/53337.html

相关文章

Tomcat调优

文章目录 一、JVM组成JVM组成堆和栈的拓展垃圾回收垃圾确定方法垃圾回收基本算法 分代堆内存垃圾回收策略堆内存分代 二、参数调整java 内存调整相关参数Tomcat的JVM的参数设置 在目前流行的互联网架构中,Tomcat在目前的网络编程中是举足轻重的,由于Tomc…

【管理咨询宝藏137】RB大型卡车集团供应链体系优化设计方案中期汇报

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏137】RB大型卡车集团供应链体系优化设计方案中期汇报 【格式】PDF版本 【关键词】罗兰贝格、供应链管理、运营提升 【核心观点】 - 甲方采取销售…

通过分离有色和无色pdf页面减少打印费

前言 该工具是我认识的一位中科大的大佬在本科毕业的时候做的一个小工具,去打印店打印全彩的毕业论文的话会比较贵,他想到有没有一种方案可以实现有彩色页面的pdf和没有彩色页面的pdf分开打印,前者打印彩色,后者打印黑白&#xf…

K8S - 实现statefulset 有状态service的灰度发布

什么是灰度发布 Canary Release 参考 理解 什么是 滚动更新,蓝绿部署,灰度发布 以及它们的区别 配置partition in updateStrategy/rollingUpdate 这次我为修改了 statefulset 的1个yaml file statefulsets/stateful-nginx-without-pvc.yaml: --- apiVe…

Java反射API详解与应用场景

一、Java反射API简介: 一、什么是反射: 反射是一种强大的工具,它允许我们在运行时检查类、方法和字段的信息,甚至允许我们动态的调用特定类的方法或改变字段的值。编程语言中的反射机制通常用于从类、对象或方法中检索元数据,或者更特别的说,从代码本身中获取信息。这就…

[MRCTF2020]PixelShooter

一个apk文件 jeb打开发现是apk文件 apk游戏逆向必须知道的知识: 一般关键数据在 Assets/bin/data/managed/assembly-csharp.dll这个文件里面 我不知道jeb为什么这里我没有 apk是个压缩包 直接解压 这个文件解压也可以发现flag {Unity_1S_Fun_233}

Python-算法编程100例-滑动窗口(入门级)

题目1:最大连续1的个数(简单) 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 解答:前缀和双指针 # 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 from typing import Listclass So…

x86 平台实现一个原子加法操作

1&#xff0c;先上代码 #include <iostream> #include <omp.h>int atomicAdd(int* ptr, int value) {int result;asm volatile("lock xaddl %0, %1\n": "r" (result), "m" (*ptr): "0" (value), "m" (*ptr): &…