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通常适用于单元测试等场景,业务开发中一般不会用到这个函数