一、协程简介
Kotlin 中的协程提供了一种全新处理并发的方式,您可以在 Android 平台上使用它来简化异步执行的代码。协程是从 Kotlin 1.3 版本开始引入。
协程作用:
处理耗时任务 (Long running tasks),这种任务常常会阻塞住主线程;
保证主线程安全 (Main-safety) ,即确保安全地从主线程调用任何 suspend 函数。
协程的特点
- 轻量:
您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。 - 内存泄漏更少:
使用结构化并发机制在一个作用域内执行多项操作 - 内置取消支持:
取消操作会自动在运行中的整个协程层次结构内传播。 - Jetpack 集成:
许多 Jetpack 库都包含提供全面协程支持的扩展。某些库还提供自己的协程作用域,可供您用于结构化并发。
协程的四个基础概念
- suspend function:
挂起函数,delay() 就是协程库提供的一个用于实现非阻塞式延时的挂起函数。 - CoroutineScope:
协程作用域,GlobalScope 是 CoroutineScope 的一个实现类,用于指定协程的作用范围,可用于管理多个协程的生命周期,所有协程都需要通过 CoroutineScope 来启动。 - CoroutineContext:
协程上下文,包含多种类型的配置参数。- Job: 控制协程的生命周期;
- CoroutineDispatcher: 向合适的线程分发任务;用于指定协程要运行在哪类线程上。
- CoroutineName: 协程的名称,调试的时候很有用;
- CoroutineExceptionHandler: 处理未被捕捉的异常。
- CoroutineBuilder:
协程构建器,协程在 CoroutineScope 的上下文中通过 launch、async 等协程构建器来进行声明并启动。launch、async 均被声明为 CoroutineScope 的扩展方法。
二、协程的使用
1、添加依赖
在应用build.gradle中添加
dependencies {
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
// 协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
// 协程Android支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
// 协程Java8支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.4.3"
// lifecycle对于协程的扩展封装
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}
2、suspend
挂起函数不会阻塞其所在线程,而是会将协程挂起,在特定的时候才再恢复执行
kotlin中的delay() 函数:
挂起函数是非阻塞的,是因为它和单纯的线程休眠有着本质的区别。
挂起函数并不会阻塞其所在线程,这样就极大地提高了线程的并发灵活度,最大化了线程的利用效率。
Java 中的 Thread.sleep():
而如果是使用Thread.sleep()的话,线程就只能干等着而不能去执行其它任务,降低了线程的利用效率。
协程是运行于线程上的,一个线程可以运行多个(几千上万个)协程。线程的调度行为是由操作系统来管理的,而协程的调度行为是可以由开发者来指定并由编译器来实现的,协程能够细粒度地控制多个任务的执行时机和执行线程,当线程所执行的当前协程被 suspend 后,该线程也可以腾出资源去处理其他任务。
//挂起函数定义
public suspend fun delay(timeMillis: Long)
网友评论