Kotlin协程学习之-launch,async,withContext,runBlocking

673 阅读1分钟

launch

launch方法启动一个协程,源码如下

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job

返回的是一个job对象,job就代表一个协程,这是最简单最常用的协程启动方式

async

async方法启动一个协程,源码如下

public fun <T> CoroutineScope.async(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> T
): Deferred<T>

该方法返回的是一个deffer deffer本身继承自job,但是只比job多了一个await方法 await是一个suspend方法,在调用时会挂起调用者所在的协程,直到await的协程完成任务,并且返回 await方法与join方法很像,但是join方法是没有返回值的,只能起到挂起调用者所在协程的作用

举例

    fun fun12() {
        val job = lifecycle.coroutineScope.async() {
            for (i in 1..3) {
                delay(100)
                Log.e("LONG", " 1===========${i}")
            }
            "这是返回值"
        }
        lifecycle.coroutineScope.launch {
            Log.e("LONG", " 2===========${job.await()}")
            for (i in 1..3) {
                delay(100)
                Log.e("LONG", " 2===========${i}")
            }
        }
    }

输出结果如下

输出
com.vivo.corotutinetest E/LONG:  1===========1
com.vivo.corotutinetest E/LONG:  1===========2
com.vivo.corotutinetest E/LONG:  1===========3
com.vivo.corotutinetest E/LONG:  2===========这是返回值
com.vivo.corotutinetest E/LONG:  2===========1
com.vivo.corotutinetest E/LONG:  2===========2
com.vivo.corotutinetest E/LONG:  2===========3

withContext

不改变当前协程环境的情况下切换代码段的执行线程 比如原来的协程是在main线程里面执行的 通过withContex可以让withContext里面的代码段切换到指定的其他线程里面工作 withContex本身也是一个suspend函数,因此withContex虽然可能切换到了其他线程,但是当前协程体会挂起,直到withContex内部的代码运行完成才会继续运行withContex外部的代码

runBlocking

使用runBlocking启动的协程任务会阻断当前线程,直到该协程执行结束 runBlocking通常适用于单元测试等场景,业务开发中一般不会用到这个函数