作用:线程切换方便,代码逻辑直观
lifecycleScope.launch {
delay(100)
logD("1--100")
withContext(Dispatchers.IO) {
delay(100)
logD("2--100")
}
logD(3)
withContext(Dispatchers.IO) {
delay(100)
logD("4--100")
}
/*
上面的代码涉及到耗时操作(delay模拟的耗时操作)、涉及到线程切换,这些代码都是按照我们
所见的一行行执
行下来的
*/
val deferredOne = async(Dispatchers.IO) {
logD("deferredOne 开始了")
delay(200)
logD("async 5-200")
"async result 5-200"
}
val deferredTwo = async {
logD("deferredTwo 开始了")
delay(100)
logD("async 5-100")
"async result 5-100"
}
/*
async 启动的协程会立刻执行,而且不会阻塞这一段代码,就在这里来说:上面这两个 async{}
代码段(也就是deferredOne和deferredTwo)都会立即执行,deferredTwo不需要等待deferredOne
执行完再执行,下面的withContext(Dispatchers.IO) {} 代码段也不需要等待
deferredOne,deferredTwo执行完就可以直接开始执行,总的来说,你可以认为
deferredOne和deferredTwo以及他们下面的withContext(Dispatchers.IO) {}代码段是同时开始执行的
*/
withContext(Dispatchers.IO) {
logD("我也 开始了!!!")
delay(100)
logD("6-100")
}
logD("${deferredOne.await()}\n${deferredTwo.await()}")
/*
deferredOne.await()/deferredTwo.await()是等待它们的执行结果,注意是等待!如果你下面有代码,
也就是说你调用await后,需要等待对应的协程(这里就是指对应的async{}代码段)执行结束后才会继续
往下执行
*/
}