笔记 | 初探Kotlin协程
如何理解协程
协程是一种不同于进程
和线程
的存在,其本质是一种函数,同一线程中的多个协程是串行执行的,但为了理解仍然需要三者一起对比。
进程、线程、协程三者的上下文切换对比:
进程 | 线程 | 协程 | |
---|---|---|---|
切换者 | 操作系统 | 操作系统 | 用户(编程者/应用程序) |
切换时机 | 根据操作系统自己的切换策略,用户不感知 | 根据操作系统自己的切换策略,用户不感知 | 用户自己(的程序)决定 |
切换内容 | 页全局目录&内核栈&硬件上下文 | 内核栈&硬件上下文 | 硬件上下文 |
切换内容的保存 | 保存于内核栈中 | 保存于内核栈中 | 保存于用户自己的变量(用户栈或者堆) |
切换过程 | 用户态 - 内核态 - 用户态 | 用户态 - 内核态 - 用户态 | 用户态(没有陷入内核态) |
切换效率 | 低 | 中 | 高 |
从以上协程的特性中,可以知道协程的应用场景是I/O密集型任务
,而非计算密集型任务
。
我认为关于协程的全部,最佳参考为Google官方编写的文章:
谷歌开发者:在 Android 开发中使用协程 | 背景介绍
在安卓开发中使用协程
Kotlin 1.3
版本中开始引入了一种全新处理并发的方式:协程,可以在 Android 平台上使用它来简化异步执行的代码,主要用来解决两个问题:
- 处理耗时任务 (Long running tasks),这种任务常常会阻塞住主线程;
- 保证主线程安全 (Main-safety) ,即确保安全地从主线程调用任何 suspend 函数。
在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程上运行也是如此。suspend
并不代表后台执行,在哪里执行由调度器决定。协程可以自行暂停,而调度器负责将其恢复。Kotlin提供了以下三种调度器并罗列了其使用场景:
调度器名称 | 运行线程 | 使用场景 | 适用案例1 | 适用案例2 | 适用案例3 |
---|---|---|---|---|---|
Dispatchers.Main | Android上的主线程 | 用来处理UI交互和一些轻量级任务 | 调用suspend函数 | 调用UI函数 | 更新LiveData |
Dispatchers.IO | 非主线程 | 专为磁盘和网络IO进行了优化 | 数据库 | 文件读写 | 网络处理 |
Dispatchers.Default | 非主线程 | 专为CPU密集型任务进行了优化 | 数组排序 | JSON数据解析 | 处理差异判断 |
下面是一个使用调度器的例子。在 get 方法的主体内,调用 withContext(Dispatchers.IO) 来创建一个在 IO 线程池中运行的块。放在该块内的任何代码都始终通过 IO 调度器执行。由于 withContext本身就是一个suspend函数,它会使用协程来保证主线程安全。
// Dispatchers.Main
suspend fun fetchDocs() { // Dispatchers.Main val result = get("developer.android.google.cn") // Dispatchers.Main show(result)
}
// Dispatchers.Main
suspend fun get(url: String) = withContext(Dispatchers.IO) { // Dispatchers.IO
}
// Dispatchers.Main
为了更好地管理和使用协程,一般要指定协程上下文(CoroutineContext)和协程作用域(CoroutineScope)。
CoroutineScope
会跟踪它使用 launch
或 async
创建的所有协程。您可以随时调用 scope.cancel()
以取消正在进行的工作(即正在运行的协程)。在 Android 中,某些 KTX 库为某些生命周期类提供自己的 CoroutineScope
。例如,ViewModel
有 viewModelScope
,Lifecycle
有 lifecycleScope
。不过,与调度程序不同,CoroutineScope
不运行协程。
class ExampleClass {//异常处理private val handler = CoroutineExceptionHandler { _, exception ->println("------------BaseViewModel异常捕获--------------")exception.printStackTrace()}protected val parentJob = SupervisorJob() + handler//协程上下文protected open val coroutineContext: CoroutineContextget() = parentJob + Dispatchers.IO//协程作用域protected val scope = CoroutineScope(coroutineContext)fun exampleMethod() {// Starts a new coroutine within the scopescope.launch {// New coroutine that can call suspend functionsfetchDocs()}}fun cleanUp() {// Cancel the scope to cancel ongoing coroutines workscope.cancel()}
}
博客首发:https://ranlychan.top/archives/491.html
笔记 | 初探Kotlin协程相关推荐
- pdf 深入理解kotlin协程_协程初探
Hello,各位朋友,小笨鸟我回来了! 近期学习了Kotlin协程相关的知识,感觉这块技术在项目中的可应用性很大,对项目的开发效率和维护成本有较大的提升.于是就考虑深入研究下相关概念和使用方式,并引入 ...
- Kotlin协程 - launch原理 笔记
一.协程是如何创建的? launch.async 可以创建.启动新的协程,那么协程到底是如何创建的? runBlocking {println(Thread.currentThread().name) ...
- 枯燥的Kotlin协程三部曲(上)——概念启蒙篇
0x0.引言 Kotlin 1.3 版本开始引入协程 Coroutine,简练的官方文档和网上一堆浅尝辄止的文章让我心里有些没底,不想止步于仅仅知道: ① Android中,Kotlin协程用于解决: ...
- kotlin协程_使Kotlin协程无缝采用的5个技巧
kotlin协程 After successfully adopting coroutines in my prod project I think it is time to share 5 tip ...
- 扔物线--Kotlin协程训练营2期-2
笔记仅做自己学习用,方便自己复习知识.若正好可以帮助到Viewer,万分欣喜~ 若博客侵权,扔物线大大不允许放上面,麻烦告知 本文是扔物线Kotlin第二期协程训练营的第二篇文章 没看过第一篇文章的可 ...
- 扔物线--Kotlin协程训练营2期-1
笔记仅做自己学习用,方便自己复习知识.若正好可以帮助到Viewer,万分欣喜~ 若博客侵权,扔物线大大不允许放上面,麻烦告知 本文是扔物线Kotlin第二期协程训练营的第一篇文章 目录 一.Kotli ...
- Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync
前言 Kotlin的协程,本质上是一个线程框架,它可以方便的切换线程的上下文(如主线程切换到子线程/子线程切回主线程).而平时我们要想在Android Studio使用协程,先要在gradle引入协程 ...
- 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程
前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...
- 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?
前言 刚开始正式学协程原理的时候(以前只是学api怎么用),大概是20年6月,也就是bennyhuo大佬出书<深入理解Kotlin协程>的时候,我买了本然后细细研究,我的内心就一直有一个问 ...
最新文章
- 【转】python包导入细节
- 第一次作业:Linux 2.6.32的进程模型与调度器分析
- 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第6章-基于间歇控制的非线性多智能体系统的多一致
- 查询数据库耗费资源的sql
- python全栈_007_Python3格式化输出
- python socket编程_最基础的Python的socket编程入门教程
- Java笔记-使用RabbitMQ的Java接口生产数据并消费
- 贪心法——LeetCode 402 移除K个数字
- 每日一道算法题--leetcode 179--最大数--python
- 接口获取行政区划代码_最新行政区划代码省市区三级 乡镇街道四级 村五级 数据库(2021年1月版 )...
- 2021年N1叉车司机模拟考试题库软件及全国真题汇总
- html直角三角形怎么实现,直角三角形怎么画
- 迭代瀑布不是Scrum
- HFDS的Shell操作
- KEIL软件错误代码及错误信息
- 《网络攻防实践》第四周作业
- 28推论坛邀请注册攻略
- RobotStudio教程:ABB机器人拆垛与码垛应用示教编程与虚拟仿真
- Java_取模/取余
- LVGL 官方UI设计工具 EdgeLine代码移植
热门文章
- 在51.com一岁生日庆祝会上的致辞
- 实验4 基于预测分析表法的语法分析程序_第三十届 脑功能磁共振数据处理分析培训班...
- 云顶之弈怎么防止被机器人拉_云顶之弈:只有钻石玩家才知道的12个小技巧,都是干货!...
- 深度学习(七)梯度弥散(消散)和梯度爆炸
- 无人驾驶出租车车队长沙惊艳亮相,BIE保驾护航
- 产品经理(22) #运营
- 华为mate40pro鸿蒙冷散热,华为mate40pro曝光,2K屏+麒麟9000+鸿蒙系统+双6400万,售价感人...
- 【vite+pinia】
- Raspberry——Pi Pico和Pico W对比
- 中国人保为正华消防承保产品责任险,为消费者保驾护航!