Kotlin: Suspend挂起

2023-12-16 23:30
文章标签 kotlin suspend 挂起

本文主要是介绍Kotlin: Suspend挂起,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.协程是什么?

线程框架。【更方便】

协程就是launch里面的代码。

2.挂起谁?

挂起协程。

launch创建的协程在执行到某一个suspend函数挂起函数的时候,这个协程会被suspend(被挂起)

3.从哪儿挂起?

从当前线程挂起。

这个协程从正在执行它的线程上脱离了。不是这个协程停下来了而是协程所在的线程从这行代码开始不再运行这个协程了。

线程和协程分2波走了。

4.分离后的线程做什么?

协程的代码块在线程里到了suspend函数的时候突然执行完了、返回了。然后线程就做它自己的事情了。比如这个线程是后台线程,那么这个线程就nothing to do.该回收回收,该利用利用。如果这个线程是main thread,则线程会回去继续工作。

图中的伪代码是启动了一个执行在主线程的协程。它实质上会在主线程post()一个new task:

handler.post{val todo = suspendToDo()...
}

这个task就是协程代码。当这个协程被挂起的时候,实质上就是post()的这个task提前结束了。

然后主线程继续刷新ui。

 

协程还没用执行完,剩下的代码:协程。

5.分离后的协程做什么?

函数的代码在到达suspend函数的时候被掐断了,它会从这个挂起函数开始继续往下执行【是在指定的线程(挂起函数指定的)】

launch(Dispatchers.Main){...val todo=suspendToDo()....
}suspend fun suspendToDo(){withContext(Dispatchers.IO){....}
}

例如上面就是函数内部的withContext()所指定的io线程。

挂起函数之后,协程为我们做的事:自动把线程再切回来。

例如上面伪代码中,协程原来是在main thread中运行的,切回来就是在挂起函数执行完成之后,协程会再post()一个task,让剩下的代码继续回到主线程去执行。这是因为Dispatchers调度器可以指定协程执行的线程还可以在suspend挂起函数之后自动再切回来。【设置特殊的调度器可以让挂起函数执行完后不再切回来】

挂起的定位: 暂时切走,稍后再切回来。

 

所以,挂起:

 协程在执行到有supend标记的函数的时候会被挂起,挂起和开启一个协程一样,就是切个线程。只不过挂起函数在执行完毕之后协程会自动的重新切回它原先的那个线程。挂起就是一个稍后会被自动切回来的线程切换。

切回来的动作,叫:resume(恢复) 

挂起之后是需要恢复的,恢复这个功能是协程的。挂起函数不在协程里被调用,那么这个恢复的功能就没法实现了。


怎么做到挂起的?

如果单纯的定义一个suspend标识的函数然后在协程里面去调用它是没效果的。因为它不知道往哪里切。

对于自定义的挂起函数,例如withContext()有调度器。

协程的被挂起并不是发生在外部这个挂起函数被调用的时候,而是里面的挂起函数被调用的时候,例如常见的withContext()。【withcotext()也不是真的切线程的点,而是其内部的底层代码】

所以supend关键字并不启到协程挂起/切换线程的作用。真要挂起协程还需要在挂起函数里去调用另一个挂起函数【需要是协程自带的、内部实现了协程挂起代码的。或它的内部直接或者间接调用了某一个挂起函数,让它去真正的挂起。】

对于自定义挂起函数,需要在该函数内部直接/间接调用到某一个自带的挂起函数才行【例如withContext()】


Suspend关键字到底什么作用?

提醒。【函数的创建者对函数的调用者的提醒】

“我”是一个耗时的函数,我被我的创建者用挂起的方式放到了后台运行,所以要在协程里调用“我”。

它让我们的主线程不卡。通过挂起函数这种形式把耗时task切线程的这个工作交给了函数的创建者而不是调用者。

调用者只会收到一个提醒:你只需要把我放在一个协程里调用。

【挂起操作靠的是挂起函数里的实际代码,而不是关键字】 


总结:

怎么custom a supend function?

1.什么时候自定义?

  • 原则:耗时【io操作和计算操作】(特殊情况:事情做起来不慢,但是需要等待(delay)

2.怎么写?

  • 加上suspend关键字、用withcontext()把函数的内容包住。

学习扔物线大佬的suspend总结。

这篇关于Kotlin: Suspend挂起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502289

相关文章

Kotlin高阶函数与Lambda表达式及内联函数的介绍

目录 1、高阶函数1.1、什么是高阶函数?1.1.1、不带返回值的高阶函数1.1.2、带参数且带返回值的高阶函数1.1.3、与一般的函数进行比较 1.2、如何使用?1.3、高阶函数有什么作用? 2、Lambda表达式2.1、什么是Lambda表达式?2.1.1、无参数的写法2.1.2、有参数的写法2.1.3、有参数且有返回值的写法 2.2、如何使用?2.3、Lambda表达式有什么作用? 3

android kotlin复习 Anonymous function 匿名函数

1、还是先上个图,新建kt: 2、代码: package com.jstonesoft.myapplication.testfun main(){val count = "helloworld".count()println(count);println("------------------------")var count2 = "helloworld".count(){it ==

android开发---Kotlin语言基础语法

目录 数据打印 变量 函数 程序逻辑控制   if  when 循环 数据打印 IDE采用的androidStudio 可自行官网下载 https://developer.android.google.cn/studio/archive?hl=zh-cn 新建项目 添加一个main方法,main()函数的左边出现了一个运行标志的小箭头。现在我们只要点击一下这个

Kotlin 范型之协变、逆变、不变

一. 前言 Kotlin 中类和类型是不一样的概念。型变是指类型转换后的继承关系。Kotlin 的型变分为逆变、协变和不变。 二. 协变 如果 A 是 B 的子类型,并且Generic<A> 也是 Generic<B> 的子类型,那么 Generic<T> 可以称之为一个协变类。 2.1Java 上界通配符<? extends T> Java 的协变通过上界通配符实现。 如果

Object-Android关键字,伴生对象,Kotlin静态

目录 1、定义一个类并生成它的单例对象 原理 调用方式 2、伴生对象(静态类) 原理 调用方式 3、对象表达式 Object在Android独特的前缀通常有以下三种用法: 1、定义一个类并生成它的单例对象 object Singleton{fun test(){}} 原理 其实就是Java的单例模式,Kotlin中提供object方便创建单例 public fi

Map排序与转换的深入探索:Java与Kotlin的实现与应用

更多内容:孔乙己大叔 1. Map的排序基础 Map是一种键值对(Key-Value Pair)集合,其中每个键都映射到一个唯一的值。然而,Map接口本身并不保证顺序,这取决于具体的实现。例如,HashMap在Java和Kotlin中都是无序的,而TreeMap和LinkedHashMap则提供了有序的Map实现。 1.1 TreeMap排序 TreeMap在Java和Kotlin中都是基

Kotlin 流 Flow

挂起函数可以异步地返回一个值,而对于返回多个值,可以使用流,使用 emit(x) 发射多个值, collect { } 来收集值。 默认 流是冷的,只有 收集(collect) 时才会执行。 1. 流的创建 flow {} 生成流,emit(x) 来发射值;xxx.asFlow() 集合转成Flow;flowOf(1, 2, 3) 生成固定值的流。 1.1 flow {} flow {}

从源码角度分析 Kotlin by lazy 的实现

by lazy 的作用 延迟属性(lazy properties) 是 Kotlin 标准库中的标准委托之一,可以通过 by lazy 来实现。 其中,lazy() 是一个函数,可以接受一个 Lambda 表达式作为参数,第一次调用时会执行 Lambda 表达式,以后调用该属性会返回之前的结果。 例如下面的代码: val str: String by lazy{println("aaron

基于Android Studio的用户行程记录APK开发指南(一):项目基础配置与速通Kotlin

前言 最近博主在unity开发独立游戏,UE5系列的相关长期教程先暂时不更新了~ 请大家多多谅解~本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录。本期我们来项目基础配置与速通Kotlin 安装Android Studio 我们进入Android Studio的官网,选择下载官网链接 下载后点击exe运行安装,这里我们要选择安卓虚拟设备

Android kotlin使用Netty网络框架实践(客户端、服务端)

开发工具:Android studio  语言:kotlin 设计原理:通讯协议:头+类型+长度+数据+尾,自定义编解码器,解析和包装发送数据流,以下贴出部分关键代码 说明:代码中封装了client和server端,可以点击按钮进行通讯,可以直接在项目中使用,尤其是处理了粘包和分包问题。 编译后的效果图: 注:结尾附上完整代码下载链接 1、配置build.gradle文件