上一篇-Kotlin 学习笔记(十三)高阶函数

为什么需要协程

  举例一个异步编程中最常见的场景:后台线程执行一个A任务,下一个B任务依赖于A任务的执行结果,所以必须等待上一个任务执行完成后才能开始执行。直接上代码。

// 模拟本地创建 Token
fun requestToken(cb: (Token) -> Unit){//todo
}//组装Http请求
fun createHttpUtils(token: Token, item: Item, cb: (HttpUtils) -> Unit): {//todo
}//进行网络请求
fun postUrl(httpUtils: HttpUtils) {//todo
}

  如果在代码中调用 会怎么样呢?

fun postItem() {requestToken{ token ->createHttpUtils(token) { httpUtils->postUrl(httpUtils)}}
}

   可以看到 我们 嵌套了好几层来实现一个网络请求,可读性变差,代码也很容易出现问题。kotlin中的 协程可以帮助我们减少代码嵌套,优化线程/线程池控制。

协程使用

修改示例的方法,引入kotlin 中的协程我们再看一下 代码会发生哪些变化

// 关于suspend  后边总结,挂起函数的重点
suspend fun requestToken(): Token { ... }   // 挂起函数// 挂起函数
suspend fun createHttpUtils(token: Token): HttpUtils{ ... } fun postUrl(httpUtils: HttpUtils) { ... }// 代码使用
fun postItem() {//  注意:开发过程中不能直接使用GlobalScope.launchGlobalScope.launch {// 看似三个任务并行处理的,但其实是串联执行的val token = requestToken()val httpUtils= createHttpUtils(token)postUrl(httpUtils)}
}

  上述代码,像代码中的GlobalScope.launch不建议在日常开发中使用,此处只是为了简单代码展示。因为 GlobalScope 创建的协程没有父协程,除非执行完成或手动取消,该协程都会继续运行,而实际上在 Android 中协程的运行需要跟 Activity/Fragment 的生命周期绑定。
  看完上边的代码使用,就已经可以在项目中简单使用了

了解协程

项目中引入

            // 协程    https://github.com/Kotlin/kotlinx.coroutineskotlin_coroutines      : [group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-android', version: versions.kotlin_coroutines],kotlin_coroutines_core : [group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: versions.kotlin_coroutines],

协程概念

协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。 - 协程官方文档翻译

  协程的开发人员 Roman Elizarov 如下描述协程的:协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。

协程知识点

根据官方网站了解重要的知识点

挂起函数

//有suspend修饰符标记,这表示两个函数都是挂起函数
suspend fun requestToken(): Token { ... }
suspend fun createHttpUtils(token: Token): HttpUtils{ ... }

  挂起函数能够以与普通函数相同的方式获取参数和返回值,但是调用函数可能挂起协程,挂起函数挂起协程时,不会阻塞协程所在的线程。挂起函数执行完成后会恢复协程,后面的代码才会继续执行。但是挂起函数只能在协程中或其他挂起函数中调用。

知识点

   要想明白协程的内在,还是需要看源码

GlobalScope.launch// launch 函数源码
// CoroutineContext: 协程上下文 是一些元素的集合,包括 Job 和 CoroutineDispatcher 等元素。
// CoroutineDispatcher : 协程调度器,决定协程所在的线程或线程池  (类型 :Dispatchers.Default、Dispatchers.IO、Dispatchers.Main和Dispatchers.Unconfined)
// CoroutineScope.launch 默认使用Dispatchers.Default
public fun CoroutineScope.launch(context: CoroutineContext = EmptyCoroutineContext,start: CoroutineStart = CoroutineStart.DEFAULT,block: suspend CoroutineScope.() -> Unit
): Job {...
}

对于源码简单的解释 主要看注释部分。

创建方式

  1. CoroutineScope.launch : CoroutineScope.launch {} 是最常用的 Coroutine builders,不阻塞当前线程,在后台创建一个新协程,也可以指定协程调度器
  2. runBlocking : runBlocking {}是创建一个新的协程同时阻塞当前线程,直到协程结束。(个人很少用…)
  3. withContext: withContext {}不会创建新的协程,在指定协程上运行挂起代码块,并挂起该协程直至代码块运行完成。
  4. async : 类似CoroutineScope.launch,区别是 async 返回的Deferred 类型,Deferred 是 Job的子类,带有返回值,但是 CoroutineScope.launch 返回的 Job类型,所以 CoroutineScope.launch没有返回值。

Kotlin 学习笔记(十四)浅读协程相关推荐

  1. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  2. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  3. Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~

    又是一个月没见了,坚持永远是世上最难的事情,但,往往难事才会有更大的收获.与君共勉~ 前段时间一直在学习 Compose,所以导致 Kotlin 笔记系列搁置了好久.一方面是因为 Compose 的学 ...

  4. Lua学习笔记(六):协程

    多线程和协程 多线程是抢占式多任务(preemptive multitasking),每个子线程由操作系统来决定何时执行,由于执行时间不可预知所以多线程需要使用同步技术来避免某些问题.在单核计算机中, ...

  5. Kotlin学习笔记 第四章 解构声明 集合集合的扩展方法 Range 异常 Throw关键字

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  6. Kotlin学习笔记 第四章 Java调用Kotlin

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  7. Kotlin学习笔记 第四章Kotlin调用Java

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  8. Kotlin学习笔记 第四章注解

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. 【神经网络】学习笔记十四——Seq2Seq模型

    本文简要介绍seq2seq,即序列到序列的基本知识,是深度学习和NLP中一个重要的知识. 从三部分来说,seq2seq基本简介,应用场景和原理解析. 一.什么是Seq2Seq 所谓Seq2Seq(Se ...

最新文章

  1. 十年老码农吐血经验:跳槽千万不能选高年终低base的公司,超过15薪就要慎重!...
  2. matlab 已知函数值纵坐标值(Y值)获得对应的横坐标
  3. 杭州水利水电学院计算机多少学,杭州的一所很容易考上的公办本科大学——浙江水利水电学院...
  4. ASP.NET Core 中间件分类
  5. 解决mybatis generator无法覆盖XML
  6. C语言字符数组与字符串
  7. UI干货素材分享|导航设计
  8. 团队组成五个基本要素_如何进行团队建设和团队沟通
  9. Java中的抽象类与abstract关键字
  10. 解决andr_Android和iPhone浏览器大战,第2部分,为iPhone和Android构建基于浏览器的应用程序
  11. 豆丁网免费下载软件(冰点非常好用)
  12. python处理图片文件,python 间接处理webp图片文件
  13. 罗永浩2014 一个理想主义者的创业故事Ⅳ 演讲稿实录
  14. 基于深度学习的单目视觉深度估计研究综述
  15. Unity3D资源包中没有Bouncy材质怎么办
  16. 2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给
  17. Unity 中实现UI左右滑动效果
  18. 国际象棋AI(三)---评估
  19. 华为数字化转型之道 实践篇 第十章 数字化办公:构建全方位的连接与协同
  20. 网红KOL营销怎么做?如何寻找合适的网红KOL?

热门文章

  1. C#:实现所罗门校验算法(附完整源码)
  2. 51单片机直流电机c语言基础知识要点,完结单片机基础知识的总结(制作作品)...
  3. SRPG游戏开发(九)第五章 颜色映射与职业动画 - 一 颜色映射流程(Flow Chart)
  4. 申请互联网信息服务(ICP)经营许可证应具备的条件
  5. 【初识C语言(下篇)】
  6. windows下php的版本如何选择?
  7. netlogo实现turtles的移动
  8. c语言上机实验指导西南交通大学,操作系统原理与应用实验指导书-西南交通大学.doc...
  9. 颜色的前世今生1·一切从光开始
  10. 学术简历(Academic CV)写作示例和格式规则