添加依赖
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
创建协程
- GlobalScope.launch - 创建协程
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
- GlobalScope.async - 创建带返回值的协程,返回的是 Deferred 类
public fun <T> CoroutineScope.async(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred<T>
- withContext - 不创建新的协程,在指定协程上运行代码块
- runBlocking - 不是 GlobalScope 的 API,可以独立使用,区别是 runBlocking 里面的 delay 会阻塞线程,而 launch 创建的不会
launch和async的参数和返回值
- CoroutineContext - 可以理解为协程的上下文,有4种线程模式:
- Dispatchers.Default - 默认,它由JVM上的共享线程池支持。默认情况下,使用的最大并行级别等于CPU内核的数量,但至少是两个
- Dispatchers.IO - 它的设计目的是将阻塞的IO任务下放到共享的线程池中
- Dispatchers.Main - 协程挂起恢复后,始终在main线程上执行
- Dispatchers.Unconfined - 一个不局限于任何特定线程的协同调度程序
- CoroutineStart - 启动模式,默认是DEFAULT,除了LAZY都是创建就启动
- DEFAULT - 根据上下文立即安排协同程序的执行
- LAZY - 只有在需要时才懒散地启动协同工作,需要job.start()
- ATOMIC - 以不可取消的方式根据上下文调度协同程序执行
- UNDISPATCHED - 立即执行协程,直到它的第一个挂起点_in当前线程
- block - 方法体,定义协程内执行的操作
- Job和Deferred - Deferred继承自Job
- job.start() - 启动协程,除了 lazy 模式,协程都不需要手动启动
- job.join() - 等待协程执行完毕
- job.cancel() - 取消一个协程
- job.cancelAndJoin() - 等待协程执行完毕然后再取消
- deferred.await() - 在不阻塞线程的情况下等待该值完成,并在延迟计算完成后继续执行,返回结果值或抛出相应的异常,如果延迟被取消
suspend
suspend 表示挂起的意思,用来修饰方法的,一个协程内有多个 suspend 修饰的方法顺序书写时,代码也是顺序运行的,suspend 函数会将整个协程挂起,而不仅仅是这个 suspend 函数