美文网首页
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