首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin 协程】协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )

文章目录 一、协程的挂起和恢复概念 二、协程的 suspend 挂起函数 一、协程的挂起和恢复概念 ---- 函数 最基本的操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ; 协程 在 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行的协程..., 在子线程中执行异步任务后 , 会马上执行后续的代码 , 只是相当于 普通的多线程操作 ; 协程的作用就是 可以 顺序地执行 异步任务 和 主线程任务 , 其执行顺序按照代码顺序执行 ; 挂起 函数..., 只能在 协程体内部 或者 其它挂起函数 中调用 ; 协程外部不允许使用挂起函数 ; 在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 协程体内部 或者 其它挂起函数 中调用 ; 协程外部不允许使用挂起函数 ; 在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息

1.7K40

【Kotlin 协程】协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

文章目录 一、释放协程资源 二、使用 use 函数执行 Closeable 对象释放资源操作 三、使用 withContext(NonCancellable) 构造无法取消的协程任务 四、使用 withTimeoutOrNull...函数构造超时取消的协程任务 一、释放协程资源 ---- 如果 协程中途取消 , 期间需要 释放协程占有的资源 ; 如果执行的协程任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...null; cb = null; } } } } 三、使用 withContext(NonCancellable) 构造无法取消的协程任务...挂起函数以及之后的代码将不会被执行 ; 使用 withContext(NonCancellable) {} 代码块 , 可以构造一个无法取消的协程任务 , 这样可以避免 finally 中的代码无法完全执行...23:12:32.093 I 退出协程作用域 四、使用 withTimeoutOrNull 函数构造超时取消的协程任务 ---- 使用 withTimeout 函数 , 可以构造超时取消的协程任务

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    LiveData:还没普及就让我去世?我去你的 Kotlin 协程

    网络请求这个就不用说了,RxJava 配合 Retrofit 来做网络请求,各种复杂操作和线程切换,谁用谁知道——现在用协程就可以了,比 RxJava 方便;而 event bus,当时比较火的是两个开源库...我要说的是 Kotlin,Kotlin 在 2017 得到了 Android 官方的公开支持,在接下来这几年里,Kotlin 自身越来越完善,它的协程也越来越完善。...协程的 Flow 和 RxJava 的功能范围非常相似——其实我觉得就是一样的——但是 Flow 是协程里必不可少的一部分,而协程是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android...视频(文章)开头那个问题,Yigit 的回答是:LiveData 不会被废弃,因为两个原因: 用 Java 写 Android 的人还需要它——Flow 是协程的东西,所以如果你是用 Java 的,那其实没办法用...另一方面,在用 LiveData 的人,确实可以考虑摘除它了;但也不是着急忙慌地把它拿走,它不是毒药不是地雷,只是协程的 Flow 现在可以做这件事了,而未来 Flow 一定是会成为主流的,就像现在的

    95750

    【Kotlin 协程】协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

    一、select 函数原型 ---- 在上一篇博客 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 ) 中 , 介绍了...协程多路复用技术 , 多路复用 主要使用 select 代码块 实现 , 在 select 代码块中 调用多个协程的 onAwait 函数 , 哪个协程先返回数据 , 就选择该协程的数据作为返回值 ;...* * 这个选择函数是_biased_到第一个子句。当可以同时选择多个子句时, * 第一个有优先权。使用[selectUnbiased]表示无偏(随机)选择 * 条款。...如果当前协程的[Job]被取消或完成 * 函数挂起后,该函数立即恢复[CancellationException]。 * 有**立即取消保证**。...如果作业被取消,而此函数被取消 * 暂停,将无法成功恢复。参见[suspendCancellableCoroutine]文档了解底层细节。 * * 注意,该函数在未挂起时不会检查是否取消。

    1.2K20

    【Kotlin 协程】Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集协程 | 通过取消流收集所在的协程取消流 )

    文章目录 一、调用 Flow#launchIn 函数指定流收集协程 1、指定流收集协程 2、Flow#launchIn 函数原型 3、代码示例 二、通过取消流收集所在的协程取消流 一、调用 Flow...#launchIn 函数指定流收集协程 ---- 1、指定流收集协程 响应式编程 , 是 基于事件驱动 的 , 在 Flow 流中会产生源源不断的事件 , 就是 发射元素操作 ; 拿到 Flow 流后..., 开始 收集元素 , 按照顺序逐个处理产生的事件 ( 元素 ) ; 调用 Flow#launchIn 函数 , 传入 协程作用域 作为参数 , 可以 指定 收集 Flow 流元素 的 协程 ; 在上一篇博客...【Kotlin 协程】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 的 协程 ; Flow#launchIn 函数返回值是 Job 对象 ,...是 协程任务对象 , 可调用 Job#cancel 函数取消该协程任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : /** * 终端流操作符,在[作用域]中

    85720

    【Kotlin 协程】协程异常处理 ⑤ ( 异常传播的特殊情况 | 取消子协程示例 | 子协程抛出异常后父协程处理异常时机示例 | 异常聚合 | 多个子协程抛出的异常会聚合到第一个异常中 )

    文章目录 一、异常传播的特殊情况 1、取消子协程示例 2、子协程抛出异常后父协程处理异常时机示例 二、异常聚合 ( 多个子协程抛出的异常会聚合到第一个异常中 ) 一、异常传播的特殊情况 ---- 在...; ③ 向父协程的父协程传播异常 : 继续将异常传播给 父协程的父协程 ; 但是也有特殊情况 : 协程 调用 Job#cancel() 函数 进行取消操作时 , 会 抛出 CancellationException...使用 launch 协程构建器 创建了子协程 , 注意 如果想要子协程运行 , 必须在创建完子协程后 调用 yield() 函数 , 让 父协程 让渡线程执行权 , 也就是令 子协程 执行起来 , 否则...} } // 让渡协程的执行权, 让子协程执行 yield() Log.i...二、异常聚合 ( 多个子协程抛出的异常会聚合到第一个异常中 ) ---- 父协程 中 有多个 子协程 , 这些子协程 都 抛出了 异常 , 此时 只会处理 第一个 异常 ; 这是因为 多个 子协程

    75710

    【Kotlin 协程】Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )

    文章目录 一、流的构建器函数 1、flow 构建器 2、flowOf 构建器 3、asFlow 构建器 一、流的构建器函数 ---- 1、flow 构建器 在之前的博客 【Kotlin 协程】Flow...异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 ) 【Kotlin 协程】Flow...挂起 500ms // 在协程中, 该挂起操作不会阻塞调用线程, 会继续执行其它代码指令 // 500ms 恢复执行, 继续执行挂起函数之后的后续代码指令...发射元素 , 然后在外部 调用 Flow#collect 函数 收集元素 ; 2、flowOf 构建器 使用 flowOf 构建器函数 , 可以创建一个 发射指定元素 的 Flow 异步流 ; 代码示例...super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 携程中调用挂起函数返回一个

    50010

    破解 Kotlin 协程(2) - 协程启动篇

    本文将为大家详细介绍协程的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用协程了。 1....默认为 true,换句话说,这样创造出来的线程默认就是启动的,除非你实在不想让它马上投入工作: val myThread = thread(start = false) { //do what...但在开始运行之前无法取消 UNDISPATCHED 立即在当前线程执行协程体,直到第一个 suspend 调用 LAZY 只有在需要的情况下运行 2.1 DEFAULT 四个启动模式当中我们最常用的其实是...对于 ATOMIC 模式,我们已经讨论过它一定会被启动,实际上在遇到第一个挂起点之前,它的执行是不会停止的,而 delay 是一个 suspend 函数,这时我们的协程迎来了自己的第一个挂起点,恰好 delay...我们在前面提到我们的示例都运行在 suspend main 函数当中,所以 suspend main 函数会帮我们直接启动一个协程,而我们示例的协程都是它的子协程,所以这里 5 的调度取决于这个最外层的协程的调度规则了

    1K30

    【Kotlin 协程】Flow 异步流 ⑤ ( 流的上下文 | 上下文保存 | 查看流发射和收集的协程 | 不能在不同协程中执行流的发射和收集操作 | 修改流发射的协程上下文 | flowOn函数 )

    文章目录 一、流的上下文 1、上下文保存 2、流收集函数原型 3、流发射函数原型 4、代码示例 - 查看流发射和收集的协程 5、代码示例 - 不能在不同协程中执行相同流的发射和收集操作 二、修改流发射的协程上下文...1、Flow#flowOn 函数原型 2、代码示例 一、流的上下文 ---- 1、上下文保存 Flow 异步流 收集元素 的操作 , 一般是在 协程上下文 中进行的 , 如 : 在协程中调用 Flow...#collect 函数 , 收集元素 ; 收集元素 时 的 协程上下文 , 会 传递给 发射元素 的 流构建器 , 作为 流构建器的 上下文 ; Flow 异步流 在 收集元素 时 , 才调用 流构建器...中的代码 , 收集元素操作在协程中执行 , 流构建器 也同样在相同的协程中运行 ; 流收集元素 和 发射元素 在相同的协程上下文中 的 属性 , 称为 上下文保存 ; 2、流收集函数原型 Flow#collect...的协程上下文中执行 流发射操作 ; 1、Flow#flowOn 函数原型 Flow#flowOn 函数原型如下 : /** * 将此流执行的上下文更改为给定的[context]。

    94210

    我写了一本书,《深入理解 Kotlin 协程》

    我研究 Kotlin 协程的过程其实主要分了三个阶段。 第一个阶段,深入理解 Kotlin 协程的三篇文章。...这本书主要回答了以下几个常见的问题: 协程是什么?Kotlin 协程又是什么? Kotlin 协程的工作机制是怎样的? 如何将 Kotlin 协程投入生产实践当中?...不仅如此,本书还致力于让大家能够自己尝试动手实现自己的协程框架,成为深谙 Kotlin 协程之道的高手,这样才配得上“深入理解”这个标题。 还有一个小细节。...除了使用 Haskell 编写的 Pandoc 的插件 cross-ref 我实在无法快速上手以外,我学习到了如何使用 Python 和 Lua 编写用来在编译过程中处理图片生成逻辑和文字预处理的 Pandoc...可以说,这一本书的编写过程,除了促使我对 Kotlin 协程有了一个更加宏观的概念把控之外,我还学到了非常多有意思的东西。

    1.4K10

    干货 | KotlinNative 异步并发模型初探

    2)Kotlin/Native 自身提供给了我们两套异步并发的 API,首先是协程,但 Kotlin/Native 的协程与 Kotlin/JVM的协程区别很大,Kotlin/Native 的协程是单线程的...官方团队的 Roman Elizarov 提到了已经发布了第一个多线程协程的预览版本,这也让 Kotlin/Native的开发者们看到了官方支持多线程协程的决心。...在主分支版本的协程上,程序无法引用到 newSingleThreadContext() 函数,它曾经是 Kotlin/JVM独有的,但当前 Kotlin/Native 的预览版的多线程协程中,newSingleThreadContext...但是在协程中,我们有协程自己的基于挂起实现的锁 Mutex,因此如果要使用 Mutex 来保证并发安全,第一步要做的就是让变量的更改摆脱Worker-对象子图机制,完全将并发风险暴露出来,然后才能通过将有风险的代码包裹在...参考文档 参考链接 1:Kotlin 编译器实现协程的主要工作是 CPS 变换与状态机,官方 KEEP: https://github.com/Kotlin/KEEP/blob/master/proposals

    1.8K20

    饿了么资深Android工程师带你领略Kotlin协程的力量

    多线程的缺陷在于无法自主控制调度,除开一定会执行的主线程之外,其他线程的执行顺序都无法控制,在Java上是由Java虚拟机调度,其他平台大多是由系统控制。...第一个是可控制,不同于线程协程能做到可被控制的发起子任务;第二个是轻量级,协程非常小、占用资源比线程还少,在JVM平台上它的本质就是一次方法的调用;第三个是语法糖,目前能够使用协程的语言都提供了很好的语法糖支持...在Kotlin中如果函数的函数体内只有一个语句,那么就可以将这条语句直接赋值给函数声明。另外如果方法只有一个参数且该参数为lambda表达式的时候,可以将函数后小括号省略掉。...协程的本质也就是一次回调,只不过通过语法糖的形式让它看起来像是顺序执行。 协程切换 ? 上图中每个大括号所包含的范围是协程的执行过程。...方法内部的this指向doResume传入的参数,第一个协程启动的时候this.label默认为0,requestToken方法被调用同时label值被改为1,requestToken执行完之后会通过传入的

    2.4K51

    在 Android 开发中使用协程 | 上手指南

    有两种方式能够启动协程,它们分别适用于不同的场景: launch 构建器适合执行 "一劳永逸" 的工作,意思就是说它可以启动新协程而不将结果返回给调用方; async 构建器可启动新协程并允许您使用一个名为...通常,您应使用 launch 从常规函数中启动新协程。因为常规函数无法调用 await (记住,它无法直接调用 suspend 函数),所以将 async 作为协程的主要启动方法没有多大意义。...coroutineScope 和 supervisorScope 可以让您安全地从 suspend 函数中启动协程。...Kotlin 确保使用 coroutineScope 构造器不会让 fetchTwoDocs 发生泄漏,coroutinScope 会先将自身挂起,等待它内部启动的所有协程完成,然后再返回。...还记得我在一开始说的结构化并发是一系列编程语言特性和实践指南的集合,在 suspend 函数中引入无关联协程作用域违背了结构化并发规则。

    1.5K20

    破解 Kotlin 协程 番外篇(1) - 协程为什么被称为『轻量级线程』?

    因为即便我们把 Kotlin 丢掉,单纯协程这个东西本身就已经长时间让大家感到疑惑了,不信的话可以单独搜一下协程或者 Coroutine,甚至连 Lua 之父在提到为什么协程鲜见于早期语言实现,就是因为这概念没有一个清晰的界定...goroutine 看上去似乎不像协程,因为开发者自己无法决定一个协程的挂起和恢复,这个工作是 go 运行时自己处理的。...当然,Java 也不是必须的,我们只需要用点儿 Kotlin 反射,一样可以直接让 suspend 函数现出原形: val helloRef = ::hello val result = helloRef.call...,但如果我们用协程来承载任务,用极少量的线程来承载协程,那么锁优化就变得简单了:协程如果无法获取到锁,那么协程挂起,对应的线程就可以让出去运行其他协程了。...我更愿意把协程作为更贴近业务逻辑甚至人类思考层面的一种抽象,这个抽象层次其实已经比线程更高了。线程可以让我们的程序并发的跑,协程可以让并发程序跑得看起来更美好。 线程本身就可以,为什么要用协程呢?

    2K20

    Kotlin---使用协程的异步

    协程间的通信 协程与协程间不能直接通过变量来访问数据,会导致数据原子性的问题,所以协程提供了一套Channel机制来在协程间传递数据。...目前,在1.3.11版本的Kotlin中,produce与consume都还只是实验性的功能,没有正式release,使用时记得使用@ExperimentalCoroutinesApi标记使用的函数 runBlocking...${Thread.currentThread().name}") } coroutineContext.cancelChildren() // 取消所有子协程来让主协程结束 } suspend...它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。...协程与线程一样,对于数据的操作无法保持原子性,所以在协程中,需要使用原子性的数据结构,例如AotimicInteger等,或者使用mutex.withLock,来处理数据的原子性 import kotlinx.coroutines

    2.8K20

    【翻译】深入 Kotlin 协程

    【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 协程相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...我将会指导你使用协程相关的基本示例,并观察背后到底发生了什么。 为什么像协程这种解决方案非常有必要? 在现代应用程序开发中,处理多线程任务是不可避免的工作。...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的协程: public async Task doWork() { // do some...通过使用 CoroutineStart.LAZY 这个值,可以让协程只在开发者显式调用返回的 Deferred 实例或者 Job 实例的 await() 方法或者 join() 方法才开始运行。

    1.5K10

    Kotlin协程开篇

    · 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...存活 } 上面的代码是一个常规启动协程的方式,关键函数只有 launch,delay,这两个函数是kotlin协程独有的。...理解这句话的关键在于,协程干了什么,让这个异步操作不会卡主线程? 我们知道类似的技术在RxJava中也有,它通过手动切线程的方式指定代码运行所在的线程,从而达到不卡主线程的目的。...这个问题涉及到Kotlin协程的Scope,调度,也是协程的实现核心逻辑 Kotlin不是第一个提出协程的 实际上在Kotlin之前就有不少语言实践了协程这个概念。比如python,golang。...python的协程是基于yield关键字进行二次封装的,虽然在高层抽象上也是以函数作为协程粒度,但对比golang差的太远。

    90420

    【翻译】Kotlin 1.1 新版本同样适合安卓开发者

    更重要的是,今天我就要把这些都展示给您,让您知道在开发安卓程序过程中是多么的爽快。 类型别名:让你的事件监听更具可读性 当然,类型别名是有很多用处的。...协程 在 Kotlin 1.1 中协程是一个令人振奋的新闻。尽管最后发布的依然是带有“实验性”的包,不过它已经功能齐全并且从今天开始你也可以开始在你的项目中使用了!...协程能够让你像写同步代码块一样写异步代码,能够编写流畅的代码使得在某刻挂起任务的执行以等待结果的返回。...辛运的是, Kotlin 团队开发极其迅速,已经有好些库把协程的威力带到了安卓开发中。...这里有几个例子: 第一个是你很可能希望看到的 Jetbrains 官方提供的库: kotlinx-coroutines-android ,这个库实现了协程在安卓中的使用。

    1.1K60

    JetBrains首席语言设计师:我们将如何让Kotlin再活几十年

    Kotlin 协程(Coroutines)是在该语言的 1.0 稳定版本之后才添加进来,并在 2017 年推出了第一个实验性支持。...Kotlin 协程深受 C#  async/await 的启发,但最终的 Kotlin 设计却与 Onward 2021《Kotlin 协程:设计和实现》中所解释的有很大差异。...例如,当 Kotlin 协程在 Kotlin 1.3 中变得稳定时,它们引入了一个新的函数类——挂起函数和相应的挂起函数类型。然而,不允许将挂起的函数类型用作超类型。...这是后来在 Kotlin 1.6 中添加的,因为协程的使用变得越来越多,并且对实现此特性交互的需求也越来越多(请参阅 KT-18707 支持将挂起函数作为超类型)。...自 2016 年以来,他一直在 JetBrains 从事 Kotlin 相关的工作,并对 Kotlin 协程的设计和 Kotlin 协程库的开发做出了贡献。

    1.6K10

    Android面试题之Kotlin中async 和 await实现并发的原理和面试总结

    async 和 await 是 Kotlin 协程中实现并发的核心构件,它们的底层工作机理和设计思想对理解 Kotlin 并发编程非常重要。...2、 async 的工作机制: async 是一个协程构建器,用于启动一个新的协程并返回一个 Deferred 对象,这个对象是一个非阻塞的可等待的任务句柄。...与传统的线程阻塞有何不同? 解答:协程通过挂起函数实现挂起,协程中的挂起函数(如 await 或 delay)允许在不阻塞线程的情况下暂停协程的执行。...实现挂起时,协程把当前状态转化为一个回调,可以在稍后恢复。这与传统的线程阻塞不同:虽然阻塞会使线程停滞且无法完成其他任务,而挂起不消耗线程资源,使得线程能够继续运行其他协程或任务。...上述面试问题可以测试协程理解深度、对 Kotlin 并发模型的掌握程度以及在真实开发场景中实施异步和并发处理的能力。 END 点赞转发,让精彩不停歇!关注我们,评论区见,一起期待下期的深度好文!

    13110
    领券