美文网首页
Kotlin协程

Kotlin协程

作者: 独自闯天涯的码农 | 来源:发表于2023-03-25 15:30 被阅读0次

一、协程简介

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)

相关文章

网友评论

      本文标题:Kotlin协程

      本文链接:https://www.haomeiwen.com/subject/mybpwrtx.html