Android Kotlin 协程 线程切换 简单使用

132 阅读1分钟

作用:线程切换方便,代码逻辑直观

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{}代码段)执行结束后才会继续
    往下执行
    */

}