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() 是类似的
二,运行结果:
第一个按钮点击:
第二个按钮点击