如何在Kotlin协程取消后继续执行任务?
协程取消后执行后续任务的最优方案
协程取消的核心是可取消挂起函数(如delay)会在协程取消时抛出CancellationException,要实现取消后继续执行后续任务,不用Thread.sleep的话,最优方案是利用try-finally配合NonCancellable上下文:
- 用
try包裹主任务逻辑,在finally块中编写取消后需要执行的后续代码 - 如果后续代码包含挂起操作(比如再次调用
delay),必须用withContext(NonCancellable)包裹——因为协程取消后默认无法执行挂起操作,NonCancellable会让这段代码不受取消状态影响
示例代码
import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { try { println("主任务执行中...") delay(1000) // 可取消挂起点,协程取消时会在此抛出异常 println("主任务正常完成") // 协程被取消的话这行不会执行 } finally { println("开始执行取消后的后续任务") // 若后续任务需要挂起,必须用NonCancellable上下文 withContext(NonCancellable) { println("后续任务包含挂起操作,执行delay...") delay(500) // 这里的挂起不受协程取消影响 println("取消后的后续任务执行完毕") } } } delay(500) // 等待主任务执行一段时间后取消 job.cancel() println("已发起协程取消请求") }
方案优势
- 完全基于协程框架实现,避免了
Thread.sleep阻塞线程的资源浪费问题 - 精准控制取消后代码的执行范围,挂起操作也能正常运行
- 符合协程的非阻塞设计理念,保持代码的异步特性
内容的提问来源于stack exchange,提问作者EBRAHIM
相关产品推荐
相关产品推荐

