前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

作者头像
韩曙亮
发布于 2023-03-30 10:05:24
发布于 2023-03-30 10:05:24
7910
举报

文章目录

一、协程调度器


协程 是在 调度器 中运行的 , 在协程中有 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 生命周期绑定 ;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )
MainScope 是一个 函数 , 其返回值类型为 CoroutineScope 协程作用域 ; 这是使用了设计模式中的 工厂模式 , 生产一个 协程作用域 实例对象 ; 之后的 协程操作都要定义在该协程作用域中 ;
韩曙亮
2023/03/30
1.4K0
【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )
Android面试题之Kotlin协程一文搞定
由launch启动的协程用join()方法;用async启动的协程用await()
AntDream
2024/06/13
2690
Android面试题之Kotlin协程一文搞定
笔记 | 初探Kotlin协程
warning: 这篇文章距离上次修改已过188天,其中的内容可能已经有所变动。
Ranlychan
2023/03/05
6090
Android协程的7个必要知识点
在现代Android应用开发中,协程(Coroutine)已经成为一种不可或缺的技术。它不仅简化了异步编程,还提供了许多强大的工具和功能,可以在高阶场景中发挥出色的表现。本文将深入探讨Coroutine重要知识点,帮助开发者更好地利用Coroutine来构建高效的Android应用。
Rouse
2023/08/31
1K0
Android协程的7个必要知识点
Kotlin中的协程及在Android中的应用
Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协程。
码客说
2024/03/29
4990
协程笔记
协程在Kotlin中文文档的解释是轻量级的线程,Go、Python 等很多现成语言在语言层面上都实现协程,不过Kotlin和他们不同的的是,Kotlin协程本质上只是一套基于原生Java线程池 的封装,Kotlin 协程的核心竞争力在于:它能简化异步并发任务,以同步方式写异步代码。
HelloJack
2022/12/21
9210
协程笔记
kotlin--协程入门
如果说我们有一个耗时操作,并且完成后更新ui界面,我们以前会考虑使用异步任务,我这里模拟了一个耗时操作,点击TextView,然后开启一个异步任务,最后更新ui
aruba
2021/12/06
6690
kotlin--协程入门
kotlin 协程入门教程
链接:https://juejin.cn/post/7370994785655767067
Rouse
2024/05/28
2730
kotlin 协程入门教程
Jetpack Compose - Effect与协程
在 Jetpack Compose 中,没有像传统 Android 中的生命周期函数那样的概念。
码客说
2024/03/29
3260
如何正确的在 Android 上使用协程 ?
你还记得是哪一年的 Google IO 正式宣布 Kotlin 成为 Android 一级开发语言吗?是 Google IO 2017 。如今两年时间过去了,站在一名 Android 开发者的角度来看,Kotlin 的生态环境越来越好了,相关的开源项目和学习资料也日渐丰富,身边愿意去使用或者试用 Kotlin 的朋友也变多了。常年混迹掘金的我也能明显感觉到 Kotlin 标签下的文章慢慢变多了(其实仍然少的可怜)。今年的 Google IO 也放出了 Kotlin First 的口号,许多新的 API 和功能特性将优先提供 Kotlin 支持。所以,时至今日,实在找不到安卓开发者不学 Kotlin 的理由了。
路遥TM
2021/08/31
3.3K0
Kotlin 协程实现原理解析
Kotlin 协程是一种在 Kotlin 语言中实现并发编程的强大工具。它提供了一种轻量级的线程管理方式,使得开发者能够以接近同步代码的方式编写异步代码。本文将深入探讨 Kotlin 协程的实现原理,并分析其关键源码。
用户9505469
2024/04/10
7150
破解 Kotlin 协程(8) - Android 篇
这个框架里面包含了 Android 专属的 Dispatcher,我们可以通过 Dispatchers.Main 来拿到这个实例;也包含了 MainScope,用于与 Android 作用域相结合。
bennyhuo
2020/02/20
1.2K0
Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~
前段时间一直在学习 Compose,所以导致 Kotlin 笔记系列搁置了好久。一方面是因为 Compose 的学习在个人来看重要性更高;另一方面就是,发现学完之前的 Kotlin 系列的笔记一到笔记三后,已经基本可以在项目中使用 Kotlin 进行日常的编码了,所以才导致这个 Kotlin 学习笔记系列停更了好久,哈哈!对 Jetpack Compose 感兴趣的同学可以看一下我的另一个笔记系列—— Jetpack Compose 学习笔记。这次咱来看看 Kotlin 协程的基础知识。
修之竹
2022/08/19
1.6K0
Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~
【Kotlin】协程(一)——入门
为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。
Gavin-ZYX
2019/10/28
1.4K0
【Kotlin】协程(一)——入门
Kotlin协程:理解主要概念
在Kotlin的协程世界中,我们经常会遇到coroutineScope,CoroutineScope,supervisorScope和withContext这些概念。这些概念在初次接触时可能会让人感到困惑,但理解它们对于有效地使用Kotlin协程至关重要。本文将深入探讨这些概念的含义和用法。
陆业聪
2024/07/23
1690
Kotlin协程:理解主要概念
即学即用Kotlin - 协程
上周在内部分享会上大佬同事分享了关于 Kotlin 协程的知识,之前有看过 Kotlin 协程的一些知识,以为自己还挺了解协程的,结果...
用户1907613
2020/08/27
1.6K0
[译]Android中的简易协程:viewModelScope
取消不再需要的协程(coroutine)是件容易被遗漏的任务,它既枯燥又会引入大量模版代码。viewModelScope 对结构化并发 的贡献在于将一项扩展属性加入到 ViewModel 类中,从而在 ViewModel 销毁时自动地取消子协程。
Android 开发者
2024/01/26
4100
[译]Android中的简易协程:viewModelScope
Kotlin协程系列(三)
  前面两节,我们运用了kotlin提供的简单协程去实现了一套更易用的复合协程,这些基本上是以官方协程框架为范本进行设计和实现的。虽然我们还没有直接接触kotlin官方协程框架,但对它的绝大多数功能已经了如指掌了。本节,我们来探讨一下官方协程框架的更多功能,并将其运用到实际的生产当中,在这里,我以在Android中使用kotlin官方协程框架为例进行讲述。
故乡的樱花开了
2023/12/02
3180
【Kotlin 协程】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )
CoroutineScope.async 函数原型 : 机翻文档 , 仅供参考 ;
韩曙亮
2023/03/30
1.2K0
Kotlin 协程总结
协程并不是 Kotlin 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言层面上实现协程,甚至是 Java,也可以通过使用扩展库来间接地支持协程。
yechaoa
2022/06/10
3.5K0
Kotlin 协程总结
推荐阅读
相关推荐
【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档