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

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

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

1.6K40

Kotlin 协程】协程的挂起恢复 ② ( 协程挂起 线程阻塞 对比 )

文章目录 一、协程挂起 线程阻塞 对比 1、协程挂起 2、线程阻塞 3、挂起阻塞对 UI 的影响 4、挂起分析 一、协程挂起 线程阻塞 对比 ---- 挂起是协程中的概念 , 只能在协程中使用...; 阻塞是线程中的概念 , 可以在主线程子线程中使用 ; 1、协程挂起 协程 挂起 操作 : 在协程中使用 delay 函数 , 挂起 20 秒时间 , 然后 20 秒后更新 UI ; delay...函数挂起 suspend 函数 ; // 创建协程 GlobalScope.launch(Dispatchers.Main) { delay(20000) // 主线程更新 UI...秒后更新 UI ; // 主线程阻塞 Thread.sleep(20000) // 主线程更新 UI Log.i("MainActivity", "GlobalScope : 主线程更新 UI") 3、挂起阻塞对...协程中有挂起操作 , 会将挂起点的状态保存 , 同时协程停止执行 , 等待挂起函数执行完毕后 , 协程继续执行 ; 相当于阻塞的是协程 , 不会阻塞主线程 ;

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

    Kotlin 协程】协程启动 ③ ( 协程组合并发 | 挂起函数串行执行 | 协程组合并发执行挂起函数 )

    文章目录 一、挂起函数串行执行 二、协程组合并发执行挂起函数 一、挂起函数串行执行 ---- 在协程体中 , 连续使用多个挂起函数 , 这些函数的执行是顺序执行的 , 挂起函数 1 执行完毕后 , 才执行...import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import kotlin.system.measureTimeMillis...577 ms 二、协程组合并发执行挂起函数 ---- 如果想要两个挂起函数并发执行 , 并且同时需要两个函数的返回值 , 则使用 async 协程构建器 , 启动两个协程 , 在协程体中执行两个并发函数...kotlinx.coroutines.async import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import kotlin.system.measureTimeMillis..., 耗时 355 ms , 达到了并发执行减少执行时间的目的 ; 00:18:50.081 I 两个返回值相加 3 00:18:50.081 I 挂起函数执行耗时 355 ms

    69220

    破解 Kotlin 协程(6) - 协程挂起

    关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...简单来说就是,对于 suspend 函数,不是一定要挂起的,可以在需要的时候挂起,也就是要等待的协程还没有执行完的时候,等待协程执行完再继续执行;而如果在开始 join 或者 await 或者其他 suspend...,表示这时候目标协程还没有执行完,需要等待结果,②③是协程已经执行完可以直接拿到异常正常结果的两种情况。...,比起简单的使用,概念的理解接受需要有个小小的过程。...当然,字节码是比较抽象的,我这样写出来就是为了让大家更容易的理解协程是如何执行的,看到这里,相信大家对于协程的本质有了进一步的认识: 协程的挂起函数本质上就是一个回调,回调类型就是 Continuation

    1.2K30

    在 View 上使用挂起函数

    挂起函数 (Suspending functions) 是协程的基础组成部分,它允许我们以非阻塞的方式编写代码。...suspendCancellableCoroutine 在 Kotlin 协程库中,有很多协程的构造器方法,这些构造器方法内部可以使用挂起函数来封装回调的 API。...又由于我们已经为挂起函数中添加了对取消操作的支持,所以 lifecycleScope 被取消时,所有与之关联的协程都会被清除。...这就是使用挂起函数等待方法执行来封装回调的基本使用了。 组合使用 到这里,您可能有这样的疑问,"看起来不错,但是我能从中收获什么呢?"...通过把不同的异步操作转换为协程的挂起函数,我们获得了简洁明了地编排它们的能力。 我们还可以更进一步...

    2.3K30

    Android面试题之Kotlin 协程的挂起、执行恢复过程

    协程挂起恢复时保存的状态上下文 1.1 状态信息 协程的状态信息主要包括: 局部变量:函数当前执行到的位置以及所有局部变量的值。...挂起点:协程挂起的位置,这个位置通常是代码中的一个挂起点(suspend函数)。 调用栈:它对应当前执行的协程堆栈帧,可以看作是对函数调用链的保存。...2.2 Continuation Kotlin中的挂起函数实质上会被编译器转换成带有回调的 Continuation 对象。...挂起函数会将 Continuation 对象传递给协程的调度器。 3.2 挂起协程释放线程 调度器会暂停当前协程的执行,把线程控制权交给调度器管理的线程池或其他任务,从而释放当前线程。 4....总结 综上所述,Kotlin 协程在挂起恢复过程中,通过调度器实现线程的切换任务调度: 挂起点保存当前状态由Continuation管理。 调度器控制挂起后的线程控制权交还。

    16510

    在 View 上使用挂起函数 | 实战

    如果您希望回顾之前的内容,可以在这里找到——《在 View 上使用挂起函数》。 让我们学以致用,在实际应用中进行实践。 遇到的问题 我们有一个示例应用: Tivi,它可以展示 TV 节目的详细信息。...关于节目信息,应用内罗列了每一季每一集。...使用协程解决问题 在前一篇文章中,我们已经学习了如何使用挂起函数封装回调 API。...新的挂起函数隐藏了所有复杂的操作,从而得到了一个线性的调用方法序列,让我们来探究更深层次的细节......对于所有 API,将回调、监听器、观察者封装为挂起函数的方式基本相同。希望您此时已经能感受到我们文中例子的重复性。那么接下来还请再接再厉,将您的 UI 代码从链式回调中解放出来吧!

    1.4K30

    Kotlin协程解析系列(上):协程调度与挂起

    协程: 一种非抢占式或者协作式的计算机程序并发调度实现,程序可以主动挂起或者恢复执行,其核心点是函数或一段程序能够被挂起,稍后再在挂起的位置恢复,通过主动让出运行权来实现协作,程序自己处理挂起恢复来实现程序执行流程的协作调度...“挂起”是指协程从它当前线程脱离,切换到另一个线程运行。当线程运行到suspend函数时,会暂时挂起这个函数及后续代码的执行。简而言之,挂起函数是一个可以启动、暂停恢复的函数。...5.2 suspend本质 Kotlin 使用堆栈帧来管理要运行哪个函数以及所有局部变量。 协程在常规函数基础上添加了suspendresume两项操作用于处理长时间运行的任务。...协程其实就是一段可以挂起恢复执行的运算逻辑,而协程的挂起通过挂起函数实现,挂起函数用状态机的方式用挂起点将协程的运算逻辑拆分成不同的片段,每次运行协程执行不同的逻辑片段。...协程挂起挂起函数是一个可启动、暂停恢复的函数,被suspend修饰的函数在协程运行时不是一定会被挂起的。 挂起函数挂起实现原理就是状态机的状态转移。

    1.9K40

    进程的执行挂起

    2 进程的执行 当系统创建一个进程之后,会设置cs:ip寄存器的值,如果是fork,则ip就是fork函数后面的语句的ip地址。如果是execute则ip地址由编译器指定。...用线性地址的首地址加上ip中的偏移,得到线性地址,然后再通过页目录页表得到物理地址,物理地址还没有分配则进行缺页异常等处理。 3 进程的挂起唤醒 进程的挂起、阻塞、多进程。...进程的挂起,或者说阻塞分为两种。 1 主动挂起。通过sleep让进程间歇性挂起。sleep的原理之前有分析过,就不再分析。大概的原理 就是设置一个定时器,到期后唤醒进程。...修改进程为挂起状态,等待唤醒。 2 被动挂起。 被动挂起的场景比较多,主要是进程申请一个资源,但是资源没有满足条件,则进程被操作系统挂起。比如我们读一个管道的时候。管道没有数据可读,则进程被挂起。...进程被挂起(分为可被信号唤醒不能被信号唤醒两种)唤醒的实现。

    1.7K10

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

    文章目录 一、select 函数原型 二、Select clause 事件 1、SelectClause0 事件代码示例 2、SelectClause2 事件代码示例 三、查看挂起函数是否支持 select...一、select 函数原型 ---- 在上一篇博客 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 ) 中 , 介绍了..., 其函数原型如下 : /** * 同时等待使用_clauses_指定的多个挂起函数的结果 * 在此选择调用的[builder]范围内。...相反,每个可选择的挂起函数都具有 * 对应的非挂起版本,可以与常规的“when”表达式一起使用来选择一个 * 的选项,如果没有选项可以立即选择,则执行默认(' else ')操作。...如果当前协程的[Job]被取消或完成 * 函数挂起后,该函数立即恢复[CancellationException]。 * 有**立即取消保证**。

    1.2K20

    kotlin函数汇总

    这篇主要讲讲kotlin里面的各种函数 简化函数 所谓的简化函数是假如执行代码提就只是一行代码或者是单行表达式,一行就可以搞得的,就可以进行简化 fun myMethod()= print("jack...定义时不取名字的函数,我们称之为匿名函数 定义时不取名字的函数,我们称之为匿名函数,匿名函数通常整体传递给其他函数或者从其他函数返回 函数不一样,匿名函数通常不需要return关键字返回数据。...Kotlin 允许在文件内直接定义函数,这个方法可以被称为顶层函数。...b.contains(a) Kotlin中的 && 、 || 、 ?: 、 === 、 !...{ func1() //编译器报错 } } 小结: kotlin只允许内联函数函数参数内部有return,普通函数函数参数内部不能有return crossinline让编译器帮我们检查函数参数内部是不是带有

    37150

    KotlinKotlin 高阶函数 ( 高阶函数当做参数 | 高阶函数定义 | 高阶函数调用 )

    Kotlin 高阶函数概念 II . Kotlin 高阶函数 作为 参数 示例解析 ( forEach 方法参数解析 ) III ....用作函数参数的 函数类型变量 ( 本示例中使用匿名函数 ) IV . 函数类型实例使用 V . Kotlin 高阶函数 整体代码示例 I ....Kotlin 高阶函数概念 ---- Kotlin 高阶函数 : Kotlin 的高阶函数 , 就是方法的参数 或 返回值 是函数类型的 函数 ; 如 : List 集合的 forEach( ) 循环...Kotlin 高阶函数 作为 参数 示例解析 ( forEach 方法参数解析 ) ---- 1 ....Kotlin 高阶函数 整体代码示例 ---- Kotlin 高阶函数 整体代码示例 : package fp /* 这里定义了一个函数 , 参数类型是 String , 返回值是 Unit

    80210

    玩转Kotlin 彻底弄懂Lambda高阶函数

    首先熟悉Kotlin语言的童鞋应该都知道Kotlin函数参数是使用 Pascal 表示法定义(name: type), 因此sum2: 后面的这一坨代表的是一种类型type,那具体代表的是什么类型呢?...在Kotlin中一切皆对象,包括函数也是对象,既然是对象, 同Integer, String等对象一样,一个函数也有自己的类型type (x: Int, j: Int) – Int这种表述方式就是表达函数的类型...(sum2)打印出来的结果都是Function2, 这是Kotlin的一个对象,代表的是一个函数类型 分析 在理解了高阶函数的定义以及使用之后,我们回过头来理解一下 view.setOnClickListener...({v – viewClicked(v) }) 在 Kotlin 中有一个约定,如果函数的最后一个参数是一个函数,并且你传递一个 lambda 表达式作为相应的参数,你可以在圆括号之外指定它 因此可以实现如下...view.setOnClickListener{v – viewClicked(v) } 总结: Lambda高阶函数理解起来有点绕,需要大量的练习实验才能慢慢的理解(一些复杂的代码写的多了 习惯了之后自然而然的就没有为什么要这样写了

    3K10

    Kotlin 函数声明扩展(extension)

    Kotlin 扩展的使用实现分析 声明一个 Kotlin 扩展如下: // StringUtils.kt fun String.appendHaha(): String { return this...扩展声明为顶层声明的时候可以被外部调用(是的,因为函数是一等公民,在方法内部也可以声明扩展方法)。 在函数体内用 this 来引用调用的实例,属性方法的访问权限与普通调用一致。...实际上 Java 想要调用 Kotlin 的扩展方法也确实是这样调用的。 扩展方法的调用实例方法调用一致,在调用者角度没有区别。...Kotlin 的扩展特性 objective-C 的 category 特性功能非常相似,都是为一个现有的类添加方法(且只能添加方法),只是代码组织结构上有些许差异。...相比 Utils 工具类,Kotlin 扩展特性能有效减少开发者心智负担沟通成本,从而提高开发效率。

    98520

    Kotlin中的函数

    lamba两种方式,其他的java中的可变参数一致。...这里等待后面具体来看什么时候非内联 在 Kotlin 中,我们可以只使用一个正常的、非限定的 return 来退出一个命名或匿名函数。...如果一个函数只有一个表达式,则可以直接写"=" fun double(x:Int):Int=x*2 局部函数 Kotlin 支持局部函数,即一个函数在另一个函数内部。...闭包 Lambda 表达式或者匿名函数(以及局部函数对象表达式) 可以访问其 闭包 ,即在外部作用域中声明的变量。...可以实现dsl风格的代码全靠它 Kotlin 提供了使用指定的 接收者对象 调用函数字面值的功能。 可以调用该接收者对象上的方法而无需任何额外的限定符,可以任意调用接受者的方法属性。

    2.3K40
    领券