kotlin: 监控协程的执行结束

一,代码:

        binding.button1.setOnClickListener {
            runBlocking {
                suspend fun download() {
                    // 模拟下载任务
                    val time=3000L
                    logX("模拟下载用时: = $time")
                    delay(time)
                }
                val job = launch(start = CoroutineStart.LAZY) {
                    logX("launch协程 开始!")
                    download()
                    logX("launch协程 结束!")
                }
                delay(500L)
                job.log()
                job.start()
                job.log()
                job.invokeOnCompletion {
                    logX("job执行结束")
                    job.log() // 协程结束以后就会调用这里的代码
                }
                println("开始join")
                job.join()      // 等待协程执行完毕
                logX("处理结束!")
            }
        }

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                val deferred = async {
                    logX("async协程开始!")
                    delay(1000L)
                    logX("async协程结束!")
                    "协程返回结果!"
                }
                println("开始await")
                val result = deferred.await()
                println("await返回结果: = $result")
                logX("处理结束!")
            }
        }

在这里说明一下await(),它是用来获取执行完的结果,
也就是即使不执行await(), async()的协程仍然会执行

deferred.await() 这个方法,不仅可以帮助我们获取协程的执行结果,
它还会阻塞当前协程的执行流程,直到协程任务执行完毕。
在这一点的行为上,await() 和 join() 是类似的

二,运行结果:

第一个按钮点击:

第二个按钮点击

posted @ 2025-07-26 11:38  刘宏缔的架构森林  阅读(14)  评论(0)    收藏  举报