kotlin协程学习总结

1.协程是什么?

kotlin中的协程是基于协程框架Coroutine实现的轻量级线程,提供一种简化处理异步任务的方式。

2.怎么使用协程?

使用协程框架中的launch方法包裹的代码块就是协程的内容,常规的代码如下:

val coroutineScope = CoroutineScope(context)
coroutineScope.launch {getImage(imageId)
}

在实际的项目中,我们通常使用ViewModel.viewModelScope来直接使用launch函数:

// 这里定义了一个高阶函数,便于其他调用的地方直接传入携程代码块
//viewModelScope.launch 函数用于创建并启动一个新的协程,以异步执行一段代码块,不会阻塞当前主线程
// viewModelScope是属于ViewModel的扩展属性,方便在ViewModel中使用协程,并且可以监测Activity或者Fragment的生命周期,然后自动取消,避免内存泄漏
private fun launch(block: suspend () -> Unit, error: suspend (Throwable) -> Unit) = viewModelScope.launch {try {block()} catch (e: Throwable) {error(e)}}

3.怎么理解挂起?

viewModelScope.launch {var heFengCity = repository.transPortAdCodeToLocationID(areaid)Toast.makeText(CoolWeatherApplication.context, heFengCity, Toast.LENGTH_SHORT)
}
......
suspend fun transPortAdCodeToLocationID(adcode: String) : HeFengCity = withContext(Dispatchers.IO) {var city = hefengNetWork.fetchFefengLocation(adcode)caCheCurrentName(city?.location?.get(0)?.name)city}

当执行到transPortAdCodeToLocationID函数的时候,launch中的协程代码就会被切换到另外的IO线程执行,相当于是在当前线程做了一个post的动作,并不会阻塞当前线程的继续执行。当协程代码中的transPortAdCodeToLocationID方法在IO线程执行完之后,会自动切换回之前的线程,并执行toast方法。这样在遇到suspend方法发生线程切换执行,在完成方法执行之后再切换回来原来线程的过程,就叫做挂起。

4.suspend关键字的作用

使用suspend关键字修饰的方法,表示这是一个挂起函数。但仅仅是有suspend,是不能实现挂起的动作的,挂起的动作是由协程内部框架帮我们实现的,即需要直接或者间接调用协程系统内部的suspend方法。比如这里的就调用了withContext方法,它就是协程框架提供的挂起函数。
同时,一个挂起函数,只能在协程代码块中被调用或者被另一个挂起函数调用,最终还是要在协程代码块中被调用,不然就会报错误:

fun getImage(imageId: Int) = withContext(Dispatchers.IO) {// IDE 报错 Suspend function'withContext' should be called only from a coroutine or another suspend funcion
}

5.什么是非阻塞式挂起

既然协程挂起可以实现切线程,那肯定就不会阻塞当前的线程了。至于为什么叫非阻塞式挂起,是因为在实现协程代码的时候,是使用了看似阻塞式的书写方式,但是又实现了非阻塞式的效果。如:

main {GlobalScope.launch(Dispatchers.Main) {val user = suspendingRequestUser() // 耗时操作updateView(user)}private suspend fun suspendingRequestUser() : User = withContext(Dispatchers.IO) {api.requestUser()}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode 开发代码片段插件

环境准备 node - 20v版本 ,推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具, npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …

使用openai-whisper实现语音转文字

使用openai-whisper实现语音转文字 1 安装依赖 1.1 Windows下安装ffmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 # ffmpeg官网 https://ffm…

Unity之闪电侠大战蓝毒兽

目录 🎨一、创建地形 🎮二、创建角色 🏃2.1 动画 🏃2.2 拖尾 🏃2.3 角色控制 ​🏃2.4 技能释放 🏃2.5 准星 📱三、创建敌人 🐲3.1 选择模型 🐲3.…

Netty Review - NIO空轮询及Netty的解决方案源码分析

文章目录 Pre问题说明NIO CodeNetty是如何解决的?源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…

专题十一、指针和数组

指针和数组 1. 指针的算术运算1.1 指针加上整数1.2 指针减去整数1.3 两个指针相减1.4 指针比较1.5 指向复合常量的指针 2. 指针用于数组处理3. 用数组名作为指针3.1 数组型实际参数(改进版)3.2 用指针作为数组名 4. 指针和多维数组4.1 处理多维数组的元素…

log4j2的使用

基础用法 1. pom文件导入依赖 junit用来做测试 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.5</version></dependency><dependency><groupId>org.…

国际网络专线多少钱一年

国际网络专线作为企业扩展业务的重要通信渠道&#xff0c;已经成为许多企业不可或缺的选择。然而&#xff0c;对 于许多企业来说&#xff0c;选择一条稳定、高质量的国际网络专线&#xff0c;并不是一件容易的事情。那么&#xff0c;国际 网络专线到底多少钱一年呢&#xff1f;…

每日一题 KY188 哈夫曼树

哈夫曼树&#xff0c;第一行输入一个数n&#xff0c;表示叶结点的个数。需要用这些叶结点生成哈夫曼树&#xff0c;根据哈夫曼树的概念&#xff0c;这些结点有权值&#xff0c;即weight&#xff0c;题目需要输出所有结点的值与权值的乘积之和的最小值。 输入描述: 输入有多组…

BGP 邻居建立

拓扑图 配置 BGP进程号及为AS号 使用环回口建立BGP邻居关系时&#xff0c;需要指定更新源地址 EBGP在使用环回口建立邻居关系时&#xff0c;需配置EBGP多跳&#xff0c;环回口路由可达 EBGP的路由器存在IBGP邻居时&#xff0c;需要配置next-hop-local&#xff0c;保证下一跳…

如何使用 ChatGPT 指令大全

你是否常常看到网路上分享的 ChatGPT 案例,但自己用了后收到的答覆并没有太大帮助?之所以会这样,是因为指令给的不够精确与到位。要让 ChatGPT 发挥最大效用,你需要好的指令。如果你不知道如何给出好的指令,不用担心,让 ChatGPT 指令大全来帮助你 😀 下 ChatGPT 指令…

适合tiktok运营的云手机需要满足什么条件?

TikTok作为一款全球热门的社交媒体平台&#xff0c;具有无限的市场潜力。然而&#xff0c;卖家在运营过程中常常会面临到视频0播、账号被降权、限流等问题&#xff0c;甚至可能因为多人同时使用一个IP而导致封号的风险。为了规避这些问题&#xff0c;越来越多的卖家将目光投向了…

C语言—指针(2)

回原点(......?)当我没讲&#xff0c;好难 1. 编写函数,要求用指针做形参&#xff0c;实现将二维数组(行列相同)的进行转置&#xff08;行列数据互换&#xff09;&#xff1a; ...不会写 /*1. 编写函数,要求用指针做形参&#xff0c;实现将二维数组(行列相同)的进行转置&a…

看小姐姐的效果棒极了,写了一个工具,逐帧解析视频转成图片,有没有带上商业思维的小伙伴一起研究下

一个突然的想法&#xff0c;促成了这个项目雏形。 原理是&#xff1a; 上传一个视频&#xff0c;自动将视频每一帧保存成图片 然后前端访问 就能实现如图效果 后端是python/flask 数据库mysql 前端uniapp 项目演示&#xff1a; xt.iiar.cn 后端代码如下&#xff1a; #学习…

【C深剖】数组名的细节

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 引言&#xff1a;我想我说的这个数组名细节可能很多人并没有留意&#xff0c;现在先来C设计者这样设计也很合理。 就是数组名本质上是一个指针&#xff0c;但是这个指针的内容也就是说指向的空间是固定的&#xff0c…

unplugin-vue-components解决命名冲突

我们在vue项目中通常会利用unplugin-vue-components插件进行自定义组件的自动引入 注&#xff1a;如果不知道怎么配置unplugin-vue-components插件&#xff0c;欢迎看我整理的这篇&#xff1a; vue3项目配置按需自动引入自定义组件unplugin-vue-components 当出现同名文件时&a…

先进电机技术——感应电机与同步电机

一、感应电机 感应电机&#xff08;Induction Motor&#xff09;是一种广泛应用的交流电动机&#xff0c;其工作原理基于电磁感应定律。在感应电机中&#xff0c;定子绕组连接到电源后会因通入的交流电而产生一个旋转磁场。这个磁场在空间中是连续变化并以恒定的速度&#xff…

【医学大模型】Text2MDT :从医学指南中,构建医学决策树

Text2MDT &#xff1a;从医学指南中&#xff0c;构建医学决策树 提出背景Text2MDT 逻辑Text2MDT 实现框架管道化框架端到端框架 效果 提出背景 论文&#xff1a;https://arxiv.org/pdf/2401.02034.pdf 代码&#xff1a;https://github.com/michael-wzhu/text2dt 假设我们有一…

算法-矩阵置零

1、题目来源 73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1…

c# 线程间操作无效—从不是创建控件的线程访问它,解决办法

一、问题原因 C#中的线程间操作无效错误通常是由于在非创建控件的线程上访问控件引发的。这是因为UI控件只能在创建它们的线程上进行访问和操作&#xff0c;否则会引发异常。   问题的根源是在多线程应用程序中&#xff0c;当一个线程尝试访问或修改UI控件时&#xff0c;如果…

机器学习---规则学习(一阶规则学习、归纳逻辑程序设计)

1. 一阶规则学习 “一阶”的目的&#xff1a;描述一类物体的性质、相互关系&#xff0c;比如利用一阶关系来挑“ 更好的”瓜&#xff0c;但实际应用 中很难量化颜色、 …、敲声的属性值。一般情况下可以省略全称量词。 命题逻辑&#xff1a;属性-值数据 色泽程度&#xff1a…