kotlin: 协程的启动方式的不同:launch/runBlocking/async
一,代码:
//launch
binding.button1.setOnClickListener {
println("点击代码块开始:")
GlobalScope.launch { // 1
println("Launch执行开始") // 2
delay(1000L) // 3
println("Launch执行结束") // 4
}
println("Sleep执行开始") // 5
Thread.sleep(2000L) // 6
println("Sleep执行结束")
println("点击代码块结束")
}
//runBlocking
binding.button2.setOnClickListener {
println("点击代码块开始:")
runBlocking { // 1
println("runBlocking执行开始") // 2
delay(1000L) // 3
println("runBlocking执行结束") // 4
}
println("Sleep执行开始") // 5
Thread.sleep(2000L) // 6
println("Sleep执行结束")
println("点击代码块结束")
}
//async
binding.button3.setOnClickListener {
println("点击代码块开始:")
runBlocking { // 1
println("runBlocking执行开始") // 2
val delayed = async {
println("inner begin:")
// 模拟网络请求
delay(1500) // 假设网络请求延迟1.5秒
println("inner end:")
"数据获取成功" //返回
}
println("得到delayed:")
val retData = delayed.await()
println("得到返回数据:"+retData)
println("runBlocking执行结束") // 4
}
println("Sleep执行开始") // 5
Thread.sleep(2000L) // 6
println("Sleep执行结束")
println("点击代码块结束")
}
不同之处:
launch启动协程不带有阻塞属性
runBlocking
是带有阻塞属性的,它会阻塞当前线程的执行
async{} 创建协程不会阻塞,并且还能通过它返回的句柄拿到协程的执行结果
二,运行结果:
launch
runBlocking
async