【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )
2023-09-14 09:07:26 时间
一、协程调度器
协程 是在 调度器 中运行的 , 在协程中有 3 种调度器 :
- Dispatchers.Main 调度器 : 在 主线程 中运行 , 处理 UI 交互任务 ; 使用场景如 : 调用 挂起 suspend 函数 , 更新 UI , 更新 LiveData ;
- Dispatchers.IO 调度器 : 在 子线程 中运行 , 处理 文件操作 和 网络 IO 操作 ; 使用场景如 : 数据库增删查改 , 文件读写处理 , 网络数据处理 ;
- Dispatchers.Default 调度器 : 在 子线程 中运行 , 处理 CPU 耗时任务 , 主要侧重算法消耗 ; 使用场景 : 数据排序 , 数据解析 , 数据对比 等耗时算法操作 ;
这里特别注意 , 在协程中调用 挂起 suspend 函数 , 必须在 Dispatchers.Main 调度器中执行 ;
Dispatchers.IO 调度器 和 Dispatchers.Default 调度器 都是在子线程 中执行耗时任务 , 但是在取消任务方面 , 磁盘或网络操作 与 CPU 密集型操作 是不同的 , 需要采用不同的任务取消策略 , 因此这里将耗时任务分配成两种调度器 ;
二、协程任务泄漏
协程任务泄漏 : 发起 协程任务 后 , 无法追踪任务的执行结果 , 任务等于无效任务 , 但是仍然会消耗 内存 , CPU , 网络 , 磁盘 等资源 ;
Kotlin 中引入了 结构化并发机制 避免 协程任务泄漏 的情况发生 ;
协程任务泄漏 与 内存泄漏 类似 ;
三、结构化并发
结构化并发 使用场景 :
- 协程任务取消 : 在不需要协程任务的时候 , 取消协程任务 ;
- 追踪协程任务 : 追踪正在执行的协程任务 ;
- 发出错误信号 : 如果 协程任务执行失败 , 发出错误信号 , 表明执行任务出错 ;
协程任务 运行时 , 必须指定其 CoroutineScope 协程作用域 , 其会追踪所有的 协程任务 , CoroutineScope 协程作用域 可以取消 所有由其启动的协程任务 ;
常见的 CoroutineScope 协程作用域 :
- GlobalScope : 该作用域是 进程级别的 , 与应用进程同级 , 即使 Activity 被销毁 , 协程任务也可以继续执行 ;
- MainScope : 该 作用域仅在 Activty 中 , 如果 Activity 被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ;
- viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel 生命周期绑定 ;
- lifecycleScope : 该作用与仅在 Activity 中使用 , 与 Activity 生命周期绑定 ;
相关文章
- Kotlin Vocabulary | 唯一的 "对象"
- android Kotlin int类型和Long类型转换
- Kotlin 1.4 来了!全新语言特性和更多改进
- Java vs Kotlin
- kotlin compose 升级的苦涩 | 一地鸡毛
- 开心档-Kotlin 基础语法
- Kotlin 泛型:基本使用
- 【Kotlin】循环控制流 ( for 循环 | Iterator 遍历形式 | Iterator 遍历要求 | IntArray 源码解析 )
- 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )
- 【Kotlin】函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )
- 【Kotlin】空安全 ⑤ ( 异常处理 | 捕获并处理异常 | 抛出自定义异常 )
- 【错误记录】Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )
- 【Kotlin】DSL 领域特定语言 ( apply 标准库函数分析 | 普通匿名函数 | 扩展匿名函数 | 泛型扩展匿名函数 )
- 【错误记录】Android Studio 编译报错 ( To use data binding annotations in Kotlin, apply the ‘kotlin-kapt‘ plu )