协程是什么
协程是Kotlin提供的一套线程封装的API
Kotlin中,协程一个典型的使用场景就是线程控制
协程好在哪
在Kotlin中,当函数的最后一个参数是lambda表达式时,可以将lambda写在括号外,这就是闭包原则
在项目中配置对Kotlin协程的支持
项目根目录下的 build.gradle
:
buildscript {
ext.kotlin_coroutines = '1.3.1'
}
Module下的build.gradle:
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines"
}
协程基本使用:
// 方法一,使用 runBlocking 顶层函数
runBlocking {
getImage(imageId)
}
// 方法二,使用 GlobalScope 单例对象
// 可以直接调用 launch 开启协程
GlobalScope.launch {
getImage(imageId)
}
// 方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象
// 需要一个类型为 CoroutineContext 的参数
val coroutineScope = CoroutineScope(context)
coroutineScope.launch {
getImage(imageId)
}
方法一:是线程阻塞的,不推荐使用
方法二:生命周期会和 app 一致,且不能取消,不推荐使用
方法三:推荐使用
使用Dispatchers.IO 切换到IO线程
使用Dispatchers.Main 切换到主线程
使用协程
coroutineScope.launch(Dispatchers.IO) {
...
}
launch函数含义是:创建一个新的协程,并在指定线程上运行
coroutineScope.launch(Dispachers.Main) {
...
withContext(Dispachers.IO) {
...
}
...
withContext(Dispachers.IO) {
...
}
...
}