kotlin: 协程的取消需要内部的配合

一,例子一:

代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val job = launch(Dispatchers.Default) {
                    var i = 0
                    while (true) {
                        Thread.sleep(500L)
                        //delay(500L)
                        i ++
                        println("i = $i")
                    }
                }
                delay(2000L)
                job.cancel()
                job.join()

                println("End")
            }
        }

运行结果:

 image

cancel()执行后无效,因为launch的协程中并没有判断当前协程的状态

二,改进,增加协程状态的判断:

代码:

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                val job = launch(Dispatchers.Default) {
                    var i = 0
                    while (isActive) {   //此处改进,使用isActive判断协程状态是否被取消
                        Thread.sleep(500L)
                        //delay(500L)
                        i ++
                        println("i = $i")
                    }
                }
                delay(2000L)
                job.cancel()
                job.join()

                println("End")
            }
        }

运行结果:

 image

 

posted @ 2025-08-02 15:00  刘宏缔的架构森林  阅读(6)  评论(0)    收藏  举报