【Kotlin】快速理解协程与挂起

2023-11-07

  • 本文不介绍协程挂起的基础用法,如需要请移步其他博客。
  • 本文主要讲解: kotlin中的协程是什么协程的作用挂起是什么挂起的作用
  • 本文全程尽量白话,使得协程和挂起理解起来更容易。

小故事or小事故?

之前面试的时候,有个面试官问了我一个问题:请你说一下协程和线程的区别?

我当时表面无动于衷(内心想着:好家伙,这人不会不知道协程是做啥的吧?为啥要把协程和线程一起拿出来做比较进行提问?好家伙,这公司…emmm)

这个提问方式是不是很眼熟?这位面试官不是个例,提这个问题,只有两种情况:1.他想考我是不是真的懂这两个东西,给我挖的坑让我去跳;2.他没搞懂这两个东西。
至于到底是哪种情况,不做猜测。

它会报错吗?

首先给一段代码,认真思考一下,这段代码会不会报错,为什么?
注:suspendNetWork()是一个网络请求。

viewModelScope.launch(Dispatchers.Main){
       val res=suspendNetWork()
}

很多人都可能会认为是:起了一个main线程,然后网络请求,那一定会报错的啊。

答案:不会报错(惊不惊喜,意不意外)

很多人肯定会有疑问,看完接下来的说明,解惑。

协程(viewModelScope)

  • kotlin中是否真的实现了协程?

kotlin中是没有真的实现协程的,kotlin的协程是一个Java的线程框架。而Python这些语言有纯粹的协程架构,那才是真协程。

  • kotlin协程的作用?

kotlin协程的作用是让开发者切换线程能够切得像协程一样自然,减少回调地狱出现的可能性。

何为回调地狱?
比如一个接口得到数据A后,还要用数据A去请求下一个接口。以致于callback里还有个callback…实际开发中,几个callback嵌套的事,一点也不梦幻,这就是回调地狱。js也是因为这个事,搞出个future和await来的。

  • kotlin的协程是如何解决的地域回调?
viewModelScope.launch {
            //1.获取结果1
            val treeData = treeRepository.getTreeList()
            //2.根据结果1的状态去进行2的接口请求
            if (treeData is NetResult.Success){
                val woodData=treeRepository.getWoodList(treeData.data[0].id)
                //3.根据结果2的状态去进行3的接口请求
                if (woodData is NetResult.Success){
                    val codeData=treeRepository.getCodeInfo(woodData.data[0].name)
                }
            }else{
                errorDataLiveData.postValue(ApiResultCode.API_RESULT_NORMAL)
            }
        }

像这种代码,3个接口,完成一次业务,开发者如果使用回调的话,就未免过于刺激了,就很地狱了。

使用协程后,代码的可读性极强,出现问题很容易就能找到问题所在。

从这里就可以看出那个面试官问题是:线程框架和线程的区别?
一个 进行线程切换的框架,和线程的区别,emm…自行体会吧,反正我觉得挺无厘头的。

挂起(suspend)

  • 什么是挂起?

挂起(suspend)就是个关键字而已

  • 挂起(suspend)关键字的作用是什么?

挂起这个关键字的作用是,告诉编译器,编译时这个地方要切换线程,处理回调,并且检查,挂起需要在launch中执行。

构建协程函数launch

  • launch作用

它代表的是你的线程切换,要切到的位置。

  • launch(dispatcher.io)的意思

切回来是io线程,如果是launch(dispatcher.main)则是main线程。

总结整合

  • launch代表开启协程操作,即线程切换。
  • dispathcer代表在哪里切。
  • suspend标记这里需要切。

结合上面的总结内容,这时再来看最上面那段代码是否报错。

viewModelScope.launch(Dispatchers.Main){
       val res=suspendNetWork()
}

它的真实意义是:

取回来的结果执行在main线程,而不是说在main线程执行网络请求。所以这段代码是不会报错的。

本阿sweet想说:这都是自学的,可能有很多误区,表达也很白话方式,目的是最大程度的让人看懂。
自己能够对学习的一个总结也是很nice的。不正之处还请各位码友能够指正出来!

欢迎多学习,多交流!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Kotlin】快速理解协程与挂起 的相关文章

  • 当创建 Android Jetpack Compose AndroidView 的参数发生变化时,如何替换它?

    我有一个应用程序 显示封装在其中的几个不同视图AndroidView 在下面重现的简单示例中 这些只是TextView实例 问题是更改文本 在本例中循环显示三个不同的值 似乎不会更新应用程序显示的内容 sealed class AppVie
  • Kotlin:覆盖子类型中的通用属性

    我试图编写一些通用代码 但无法摆脱Type of PROPERTY is not a subtype of the overridden property error 我的代码的简化版本 abstract class BaseP
  • 从 DecorView@2da7146[MyActivity] 中找不到 ViewTreeLifecycleOwner

    从撰写更新后alpha 11 to alpha 12 or beta 01 每当我打开具有撰写视图的活动或片段时 我都会遇到此崩溃 我在用AppCompatActivity它实现了LifecycleOwner 所以这非常奇怪 java la
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • 错误:链接引用失败。 -> 排队作业

    我正在使用 Kotlin 学习 Android Material Design 一切都很顺利 直到我尝试使用 android support design widget FloatingActionButton 当我重建项目时 我收到以下错
  • 在viewpager2中禁用动画

    我有 viewpager2 和扩展 FragmentStateAdapter 的适配器 我希望用户仅通过单击选项卡布局即可转到另一个页面 我已禁用此 viewpager2 的用户输入 但是当我单击选项卡时 有页面之间快速滑动的动画 但我只想
  • 如何将 Android Room 数据库中的 Not Null 表列迁移为 Null

    我是 Android 房间库的新手 我需要将 Not Null 列迁移到 Null 但房间迁移只允许在 ALTER 表查询中添加或重命名 如何执行列迁移查询 Entity tableName vehicle detail data clas
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • 如何将依赖 ThreadLocal 的代码与 Kotlin 协程一起使用

    一些 JVM 框架使用ThreadLocal存储应用程序的调用上下文 例如SLF4j MDC https logback qos ch manual mdc html 事务管理器 安全管理器等 然而 Kotlin 协程是在不同的线程上调度的
  • Kotlin super.finalize()

    当迁移到Kotlin from Java我遇到了一个问题 我覆盖了Object s finalize method Override protected void finalize throws Throwable stopTimer su
  • 在浏览器中运行 Kotlin HTML Builder

    我是一名 Java 开发人员 对 Kotlin 非常陌生 不过我喜欢这门语言 而且我喜欢用它可以轻松地完成 Web 应用程序 问题是我无法弄清楚如何在浏览器中运行 Kotlin HTML 构建器文件 以便我可以在 kotlin 中创建基本的
  • 获取 IntelliJ Kotlin 插件和 gradle 进行匹配

    我正在尝试 IntelliJ 16 早期访问版本 但我的项目无法编译 Error 16 17 Kotlin Unresolved reference substring note this may be caused by the fact
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 带有“final”修饰符的“val”属性的用途是什么?

    最近IntelliJ建议添加final到一个val特性 这个特殊的属性是在init 堵塞 我试图找出什么是语义final val构造以及何时应该使用它 但 Kotlin 的核心在于不变性以及如何使用它val相当于final在 Java 中
  • KDoc:插入代码片段

    如何在 Kotlin 的默认文档工具 KDoc 中插入代码片段 在 Java 中 我可以使用以下内容 Example usage pre code 64 JavaAnnotation public void foo Code code pr
  • 根据另一个列表的顺序对列表进行排序[重复]

    这个问题在这里已经有答案了 我需要对列表进行排序Person对象 List
  • Kotlin 反射不可用

    我试图从第一个例子中学习高阶函数video https www youtube com watch v a7QpoMj2uIA 这是我的代码和输出 Code fun lowercase value String value toLowerC
  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • 未向 HAL 提供足够的数据,预期位置

    我在 Android Studio 中收到此错误 我只想在按下按钮时打印文本 我收到以下错误 每次按下按钮时都会出现该错误 如果我取消注释掉意图 它也可以正常工作 但是我拥有的代码越多 错误更改就越多 我实际上不确定这是真正的错误 我这么说

随机推荐

  • 程序猿面试必背——Java资料整理

    程序猿面试必背 适用于 Java开发工程师 后台开发工程师 软件开发工程师 写在前面 秋招已结束 以下是对我帮助比较大的资料 分享一下 可能涉及到的知识点 编程语言 Java 基础知识 计算机网络 操作系统 linux 数据库 关系型如my
  • git bash 风格调整

    在用户目录下有一个 C Users minttyrc文件 用文本方式打开文件 将系统配置加入进去即可全局修改git bash的风格 当然也可以在git bash上右击选择options进行修改 个人配置内容如下 参考 Font Consol
  • 创建基于vite的vue项目

    目录 一 环境 安装Node js 安装yarn工具 二 创建项目 三 项目目录梳理 项目初始目录结构 项目加载过程 四 集成UI组件库vant 配置按需加载Vant 使用组件 引入函数组件的样式 五 集成UI组件库NutUI 配置按需加载
  • github 如何

    链接 https www zhihu com question 20393785 answer 105370502 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 原谅我只会用命令行 还是给一个使用命令行的方
  • 详解vant组件应用于Vue2

    目录 1 安装 1 1 npm安装 1 2 CDN安装 1 3 利用脚手架安装 1 3 1 安装脚手架 没有安装脚手架的 1 3 2 利用脚手架创建程序 1 3 3 使用vue ui进行依赖的安装 1 3 4 依赖安装 2 引入组件 2 1
  • express框架的基本使用

    1 引入express const express require express 2 创建应用对象 const app express 3 创建路由规则 request请求报文的封装 response响应报文的封装 app get req
  • C++的float类型数比较问题

    2020 8 17更新了一下 看到了两个float数比较的 不是0值 也加进了最末尾 相等比较 之前刷题做到一道题 看到题解很奇怪 计算一个数字的立方根 getCubeRoot double input 题解采用了二分法 但比较时并不是用直
  • 将多个HEX文件合并成一个HEX文件通过KEIL进行烧录

    首先这多个HEX文件自己已经偏移好了 hex文件已经记录了偏移的地址信息 用记事本打开第一个hex文件 test1 hex 020000040000FA 文件头记录 1000000018F09FE518F09FE518F09FE518F09
  • Docker安装以及运行第一个HelloWorld

    在安装Docker之前我们先来了解一下什么是Docker 观察Docker图标 其实很形象的解释了什么是Docker 在没有使用集装箱的情况下 我们需要考虑不同形状 尺寸的货物怎么安放 货物与货物之间是否能堆叠 这无疑是很繁琐的事情 现在有
  • 005 快排qsort库函数的用法——“C”

    文章目录 前言 一 什么是qsort快排函数 qsort的参数分析 二 使用步骤 前言 Reference C Reference cplusplus com 可在此网站查阅相关函数信息 提示 以下是本篇文章正文内容 下面案例可供参考 一
  • Reachability(判断网络是否连接)

    类似于一个网络状况的探针 NSNotificationCenter defaultCenter addObserver self selector selector reachabilityChanged name kReachabilit
  • 【ROS】学习之日志(log)消息

    参考 ROS学习之日志消息 ROS中的日志 log 消息 ROS日志级别控制 ROS日志 log 系统 通过显示进程的运行状态是好的习惯 但需要确定这样做不会影响到软件的运行效率和输出的清晰度 ROS 日志 log 系统的功能是让程序生成一
  • 傻瓜式阿里云部署java web项目步骤

    写在前面 本傻瓜式步骤适用于阿里云服务器是Windows Server 2008操作系统 一 阿里云操作步骤 1 首先提前准备好阿里云账号和密码 访问地址 阿里云 2 登录后进入首页 点击云服务器ECS 如图 3 进入云服务器ECS 点击实
  • java比较器Comparable接口和Comaprator接口

    java的比较器有两类 分别是Comparable接口和Comparator接口 在为对象数组进行排序时 比较器的作用非常明显 首先来讲解Comparable接口 让需要进行排序的对象实现Comparable接口 重写其中的compareT
  • MySQL - 普通索引

    创建和查看索引 创建索引是指在某个表的一列或多列上建立一个索引 以便提高对表的访问速度 创建索引有3种方式 分别是创建表的时候创建索引 在已经存在的表上创建索引和使用ALTER TABLE语句来创建索引 本节将根据具体的索引分类详细的讲解这
  • (最简单)使用 reset-css 初始化浏览器css样式

    目录 背景 实现 步骤一 步骤二 背景 在我们的项目初始化搭建过程中会遇到这种情况 需要我们自己清除css默认样式 但是我们不可能一周都有那个清除默认css样式的文件 实现 步骤一 在终端使用 npm 引用 reset css npm i
  • mysql linux redhat_RedHat Linux 6 下 MySQL 8.0.11安装配置

    我这里是RHEL6 5的系统 因此选择RedHat 6 x86 64bit操作系统 下载第一个RPM Bundle即可 MySQL 8 0 11 1 el6 x86 64 rpm bundle tar 目前MySQL8 0 11社区版提供了
  • C++ system()函数的常用用法 (史上最详细)

    目录 一 推荐 1 system pause 2 system color 3 system title 4 system cls 二 文件操作 1 system start 2 system del 3 system copy A B 4
  • ReactDOM.render(...) 渲染方法

    React代码的书写格式和以前的JS有很大的不同 下面通过对这段代码进行分析了解一下他 以前使用Javascript定义一个变量用var ES6加入了const关键字 用来定义一个常量 const div document createEl
  • 【Kotlin】快速理解协程与挂起

    本文不介绍协程和挂起的基础用法 如需要请移步其他博客 本文主要讲解 kotlin中的协程是什么 协程的作用 挂起是什么 挂起的作用 本文全程尽量白话 使得协程和挂起理解起来更容易 小故事or小事故 之前面试的时候 有个面试官问了我一个问题