kotlin: 用withContext(NonCancellable)使代码不响应cancel()

一,例子:用cancel()取消job

代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val job = launch {
                    try {
                        println("try start")
                        delay(1000)
                        println("try end")
                    } finally {
                        println("finally start")
                        delay(1000)
                        println("finally end")
                    }
                }
                yield()
                job.cancelAndJoin()
            }
        }

运行结果:

image

cancel()后代码未能执行完

二,改进:用withContext(NonCancellable)使代码不响应cancel()

代码:

        //处理按钮点击事件
        binding.button3.setOnClickListener {
            runBlocking {
                val job = launch {
                    try {
                        println("try start")
                        delay(1000)
                        println("try end")
                    } finally {
                        println("finally start")
                        withContext(NonCancellable) {
                            println("delay start")
                            delay(1000)
                            println("delay end")
                        }
                        println("finally end")
                    }
                }
                yield()
                job.cancelAndJoin()
            }
        }

运行结果:

image

可见,加了withContext(NonCancellable)之后,finally中的代码得到了完整执行,未被cancel,
而try中的代码则被cancel,未能执行完

posted @ 2025-08-09 13:41  刘宏缔的架构森林  阅读(8)  评论(0)    收藏  举报