协程Coroutines入门

添加依赖:

dependencies {

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0")

}

使用示例:

//方法一,使用 runBlocking 顶层函数
runBlocking {
    getUser(userId)
}
​
//方法二,使用 GlobalScope 单例对象
GlobalScope.launch {
    getUser(userId)
}
​
//方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象
val coroutineScope = CoroutineScope(context)
coroutineScope.launch {
    getUser(userId)
}

CoroutineScope(Dispatchers.IO).launch {
    getUser(userId)
}

launch并不是一个顶层函数,不能直接用,它必须在一个对象中使用,launch 函数加上实现在 {} 中具体的逻辑,就构成了一个协程。

CoroutineScope(Dispatchers.IO).launch{
    val image = getImage(imageId)
    launch(Dispatch.Main) {
        avatarIv.setImageBitmap(image)
    }
}

suspend fun getImage(imageId: String):Bitmap{
     //...
}

withContext:

这个函数可以切换到指定的线程,并在闭包内的逻辑执行结束之后,自动把线程切回去继续执行。

CoroutineScope(Dispatchers.Main).launch {//在UI线程开始
    val image = withContext(Dispatchers.IO) {//切换到IO线程,并在执行完成后切回UI线程
        getImage(imageId)//运行在IO线程
    }
    avatarIv.setImageBitmap(image)//回到UI线程更新UI
}

suspend (挂起):

协程在执行到有 suspend 标记的函数的时候,会被suspend,也就是被挂起,而所谓的被挂起,本质就是切换线程;

不过区别在于,挂起函数在执行完成之后,协程会重新切回它原先的线程。

再简单来讲,在 Kotlin 中所谓的挂起,就是一个稍后会被自动切回来的线程调度操作。

这个「切回来」的动作,在 Kotlin 里叫做 resume,恢复。

挂起之后是需要恢复的,而恢复这个功能是协程的,如果你不在协程里面调用,恢复这个功能没法实现,所以挂起函数必须在协程或者另一个挂起函数里被调用。

什么时候需要自定义suspend函数?

原则:如果某个函数比较耗时,也就是要做等的操作,那就把它写成 suspend 函数。

耗时操作一般分为两类:I/O 操作和 CPU 计算工作。比如文件的读写、网络交互、图片的模糊处理等。另外就是逻辑中有等待操作,比如delay(5) ,这种也是 suspend 函数的应用场景。

总结:

1.协程就是切线程;

2.挂起就是可以自动切回来的切线程;

3.挂起的非阻塞式指的是它能用看起来阻塞的代码写出非阻塞的操作。

你可能感兴趣的:(Android基础-总结笔记,android,kotlin)