「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
一、协程概念
协程是一种轻量级线程。协程提供了一种避免线程阻塞、开销小的异步操作。
协程可以被挂起而不是阻塞线程,线程的挂起几乎没有代价,它不需要切换上下文。
- 添加依赖包
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2-native-mt'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2-native-mt'
二、函数分析
1. launch
不会阻塞当前线程,返回一个协程的引用
- context:协程的上下文有 4种线程模式:
- Dispatchers.Default
- Dispatchers.IO
- Dispatchers.Main - 主线程
- Dispatchers.Unconfined - 没指定,就是在当前线程
- start: 启动模式,默认是DEAFAULT,也就是创建就启动:
- DEAFAULT
- ATOMIC
- UNDISPATCHED
- LAZY - 懒加载模式,你需要它的时候,再调用启动
- block: 闭包方法体,定义协程内需要执行的操作
- Job: 协程构建函数的返回值,可以把 Job 看成协程对象本身,协程的操作方法都在 Job 身上了
- job.start() - 启动协程,除了 lazy 模式,协程都不需要手动启动
- job.join() - 等待协程执行完毕
- job.cancel() - 取消一个协程
- job.cancelAndJoin() - 等待协程执行完毕然后再取消
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job {
val newContext = newCoroutineContext(context)
val coroutine = if (start.isLazy)
LazyStandaloneCoroutine(newContext, block) else
StandaloneCoroutine(newContext, active = true)
coroutine.start(start, coroutine, block)
return coroutine
}
具体使用:
GlobalScope.launch {
println("Hello World!")
}
2. runBlocking
等待协程的代码执行结束,再执行剩下的代码,如果任务是非常耗时的操作时,会一直阻塞当前线程,在实际开发中很少会用到runBlocking
3. suspend
- 协程挂起就是切个线程,在挂起函数执行完毕之后,协程会自动的重新切回它原先的线程
- 是函数创建者对函数调用者的提醒,需要用挂起的方式在协程中使用,把内容用withContext包起来