如何理解协程

协程是一种不同于进程线程的存在,其本质是一种函数,同一线程中的多个协程是串行执行的,但为了理解仍然需要三者一起对比。

进程、线程、协程三者的上下文切换对比:

进程 线程 协程
切换者 操作系统 操作系统 用户(编程者/应用程序)
切换时机 根据操作系统自己的切换策略,用户不感知 根据操作系统自己的切换策略,用户不感知 用户自己(的程序)决定
切换内容 页全局目录&内核栈&硬件上下文 内核栈&硬件上下文 硬件上下文
切换内容的保存 保存于内核栈中 保存于内核栈中 保存于用户自己的变量(用户栈或者堆)
切换过程 用户态 - 内核态 - 用户态 用户态 - 内核态 - 用户态 用户态(没有陷入内核态)
切换效率

从以上协程的特性中,可以知道协程的应用场景是I/O密集型任务,而非计算密集型任务

我认为关于协程的全部,最佳参考为Google官方编写的文章:
谷歌开发者:在 Android 开发中使用协程 | 背景介绍

在安卓开发中使用协程

Kotlin 1.3版本中开始引入了一种全新处理并发的方式:协程,可以在 Android 平台上使用它来简化异步执行的代码,主要用来解决两个问题:

  1. 处理耗时任务 (Long running tasks),这种任务常常会阻塞住主线程;
  2. 保证主线程安全 (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 会跟踪它使用 launchasync 创建的所有协程。您可以随时调用 scope.cancel() 以取消正在进行的工作(即正在运行的协程)。在 Android 中,某些 KTX 库为某些生命周期类提供自己的 CoroutineScope。例如,ViewModelviewModelScopeLifecyclelifecycleScope。不过,与调度程序不同,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协程相关推荐

  1. pdf 深入理解kotlin协程_协程初探

    Hello,各位朋友,小笨鸟我回来了! 近期学习了Kotlin协程相关的知识,感觉这块技术在项目中的可应用性很大,对项目的开发效率和维护成本有较大的提升.于是就考虑深入研究下相关概念和使用方式,并引入 ...

  2. Kotlin协程 - launch原理 笔记

    一.协程是如何创建的? launch.async 可以创建.启动新的协程,那么协程到底是如何创建的? runBlocking {println(Thread.currentThread().name) ...

  3. 枯燥的Kotlin协程三部曲(上)——概念启蒙篇

    0x0.引言 Kotlin 1.3 版本开始引入协程 Coroutine,简练的官方文档和网上一堆浅尝辄止的文章让我心里有些没底,不想止步于仅仅知道: ① Android中,Kotlin协程用于解决: ...

  4. kotlin协程_使Kotlin协程无缝采用的5个技巧

    kotlin协程 After successfully adopting coroutines in my prod project I think it is time to share 5 tip ...

  5. 扔物线--Kotlin协程训练营2期-2

    笔记仅做自己学习用,方便自己复习知识.若正好可以帮助到Viewer,万分欣喜~ 若博客侵权,扔物线大大不允许放上面,麻烦告知 本文是扔物线Kotlin第二期协程训练营的第二篇文章 没看过第一篇文章的可 ...

  6. 扔物线--Kotlin协程训练营2期-1

    笔记仅做自己学习用,方便自己复习知识.若正好可以帮助到Viewer,万分欣喜~ 若博客侵权,扔物线大大不允许放上面,麻烦告知 本文是扔物线Kotlin第二期协程训练营的第一篇文章 目录 一.Kotli ...

  7. Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync

    前言 Kotlin的协程,本质上是一个线程框架,它可以方便的切换线程的上下文(如主线程切换到子线程/子线程切回主线程).而平时我们要想在Android Studio使用协程,先要在gradle引入协程 ...

  8. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

  9. 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?

    前言 刚开始正式学协程原理的时候(以前只是学api怎么用),大概是20年6月,也就是bennyhuo大佬出书<深入理解Kotlin协程>的时候,我买了本然后细细研究,我的内心就一直有一个问 ...

最新文章

  1. 【转】python包导入细节
  2. 第一次作业:Linux 2.6.32的进程模型与调度器分析
  3. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第6章-基于间歇控制的非线性多智能体系统的多一致
  4. 查询数据库耗费资源的sql
  5. python全栈_007_Python3格式化输出
  6. python socket编程_最基础的Python的socket编程入门教程
  7. Java笔记-使用RabbitMQ的Java接口生产数据并消费
  8. 贪心法——LeetCode 402 移除K个数字
  9. 每日一道算法题--leetcode 179--最大数--python
  10. 接口获取行政区划代码_最新行政区划代码省市区三级 乡镇街道四级 村五级 数据库(2021年1月版 )...
  11. 2021年N1叉车司机模拟考试题库软件及全国真题汇总
  12. html直角三角形怎么实现,直角三角形怎么画
  13. 迭代瀑布不是Scrum
  14. HFDS的Shell操作
  15. KEIL软件错误代码及错误信息
  16. 《网络攻防实践》第四周作业
  17. 28推论坛邀请注册攻略
  18. RobotStudio教程:ABB机器人拆垛与码垛应用示教编程与虚拟仿真
  19. Java_取模/取余
  20. LVGL 官方UI设计工具 EdgeLine代码移植

热门文章

  1. 在51.com一岁生日庆祝会上的致辞
  2. 实验4 基于预测分析表法的语法分析程序_第三十届 脑功能磁共振数据处理分析培训班...
  3. 云顶之弈怎么防止被机器人拉_云顶之弈:只有钻石玩家才知道的12个小技巧,都是干货!...
  4. 深度学习(七)梯度弥散(消散)和梯度爆炸
  5. 无人驾驶出租车车队长沙惊艳亮相,BIE保驾护航
  6. 产品经理(22) #运营
  7. 华为mate40pro鸿蒙冷散热,华为mate40pro曝光,2K屏+麒麟9000+鸿蒙系统+双6400万,售价感人...
  8. 【vite+pinia】
  9. Raspberry——Pi Pico和Pico W对比
  10. 中国人保为正华消防承保产品责任险,为消费者保驾护航!