kotlin中协程相关
协程
- 用同步的方式写出异步的效果
- 协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式
- 挂起函数(suspend)不一定就是在子线程中执行的,但是通常在定义挂起函数时都会为它指定其他线程,这样挂起才有意义
- 解决多层嵌套回调
协程不是线程,是基于线程封装的库,可以使用协程库提供的API方便的灵活的指定协程中代码执行的线程、切换线程,但不需要接触线程Thread类。类似于Android的AsyncTask或者RxJava的Schedulers,都解决了异步线程切换的问题,然而协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式,把原本运行在不通线程的代码写在一个代码块{}里,开起来就像是同步代码。
launch
和async
之间的区别
launch
是一种适用于“发射并忘记”场景的协程构建器,当你不需要等待协程的结果时,它非常有用。它允许你在后台异步执行任务,而不会阻塞主线程,从而提高应用的响应性。
示例:使用launch
fun main() {println("Before launch")// 启动一个协程GlobalScope.launch {delay(1000)println("Inside launch")}println("After launch")Thread.sleep(2000)
}
在上面的示例中,我们使用launch
关键字在GlobalScope
中启动了一个协程。协程通过delay()
函数暂停了1000毫秒,然后打印了"Inside launch"。同时,主线程继续执行。输出结果为:Before launch After launch Inside launch
async
是一种用于异步执行任务并获取其结果的协程构建器。它返回一个Deferred<T>
对象,表示将来可用的值
示例:使用async并发进行网络请求
suspend fun fetchDataFromAPI(url: String): String {// 执行网络请求或其他耗时操作return apiService.fetchData(url)
}suspend fun fetchMultipleData() {val deferredData1 = GlobalScope.async(Dispatchers.IO) {fetchDataFromAPI("https://api.example.com/data1")}val deferredData2 = GlobalScope.async(Dispatchers.IO) {fetchDataFromAPI("https://api.example.com/data2")}val data1 = deferredData1.await()val data2 = deferredData2.await()// 处理获取到的数据```kotlinprocessData(data1, data2)
}
在这个示例中,我们使用async
来并发地从多个URL获取数据。每个网络请求被封装在一个单独的async
块中,它返回一个Deferred<String>
对象。然后我们使用await()
来在结果可用时获取结果。获取到数据后,我们可以根据需要进行进一步处理。
总结选择launch
和async
的关键考虑因素:
-
当你想要执行一个异步任务而不需要等待结果时,例如进行网络请求或执行后台操作时,使用
launch
。 -
当你需要并发地执行多个异步任务并获取它们的结果以进行进一步处理时,例如并行网络请求或计算时,使用
async
。 -
要注意选择合适的上下文来启动协程,以确保正确的线程管理。对于与UI相关的操作,切换到
Dispatchers.Main
上下文来更新UI。 -
避免使用长时间运行的操作阻塞主UI线程。使用协程将这些任务转移到后台线程,从而确保响应性用户界面
suspend:withContext(Dispatchers.IO)异步线程
MainScope 需要销毁在onDestroy()方法中:main.cancel()
GlobalScope 全局作用域 默认是异步线程Dispatchers.IO
viewModelScope.launch 默认是主线程Dispatchers.Main
一个页面请求多个接口示例
class SystemViewModel : BaseViewModel() {private val remoteRepository: SystemRemoteRepository by lazy {SystemRemoteRepository()}val page = MutableLiveData<Pagination<Article>>()fun getArticleList() {viewModelScope.launch { //主线程开启一个协程// 网络请求:IO线程val tree: ApiResult<MutableList<Tree>> =RetrofitClient.apiService.getTreeByCoroutines()// 主线程val cid = tree?.data?.get(0)?.idif (cid != null) {// 网络请求:IO线程val pageResult: ApiResult<Pagination<Article>> =RetrofitClient.apiService.getArticleListByCoroutines(0, cid)// 主线程page.value = pageResult.data!!}}}
}/**接口定义,Retrofit从2.6.0版本开始支持协程*/
interface ApiService {/*获取文章树结构*/@GET("tree/json")suspend fun getTreeByCoroutines(): ApiResult<MutableList<Tree>>/*根据数结构下某个分支id,获取分支下的文章*/@GET("article/list/{page}/json")suspend fun getArticleListByCoroutines(@Path("page") page: Int,@Query("cid") cid: Int): ApiResult<Pagination<Article>>
}
相关文章:
kotlin中协程相关
协程 用同步的方式写出异步的效果协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式挂起函数(suspend)不一定就是在子线程中执行的,但是通常在定义挂起函数时都会为它指定其他线程,这样挂起才有意义解决多层嵌套回调 协程不是线程&…...

(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目
(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目PbootCMS内核开发的网站模板,该模板适用于物流运输网站、仓储货运网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;自适应手机端,同一个后台…...

Navicat导出表结构到Excel或Word
文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…...

Golang编译优化——稀疏条件常量传播
文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播(constant propagation)是一种转换,对于给定的关于某个变量 x x x和一个常量 c …...
人工智能培训讲师咨询叶梓介绍及智能医疗技术与ChatGPT临床应用三日深度培训提纲
1、授课老师简介 叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的…...

HCIP(BGP综合实验)--8
一:实验要求 二:实现过程 (一)配置IP地址: AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […...

深入理解C++中的Vector容器:用容器构建高效程序
文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现,C的这个部分内容就是众所周知的STL(标准模版库)&a…...
目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(下)
目录 3.2 基于空洞卷积的特征融合模块设计 3.3 改进k-means聚类算法的anchor尺寸优化设计...
react 类组件 和 函数组件 声明周期 对比
React 的类组件和函数组件在生命周期方面存在一些差异。以下是它们之间的对比: 类组件的生命周期 React 类组件的生命周期可以分为三个阶段:挂载、更新和卸载。 1、挂载阶段: constructor():组件实例化时调用,用于…...

智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新
一、方案概述 随着科技的不断进步,人工智能(AI)技术已经深入到各个领域。在变电站安全监控领域,引入AI视频监控智能分析系统,可以实现对站内环境、设备状态的实时监控与智能分析,从而提高变电站的安全运行…...

【Ubuntu20.04安装java-8-openjdk】
1 下载 官网下载链接: https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz,并解压: tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…...

HTTPS对于网站到底价值几何?
现在HTTPS基本上已经是网站的标配了,很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象,当时只有几家大型互联网公司的网站会使用HTTPS,大部分使用的都还是简单的HTTP,这一切是怎么发生的呢? 为什么要把网站…...

Docker私有仓库Harbor
简介 Docker私有仓库Harbor是一个开源的、企业级的Docker registry解决方案,它提供了安全、可靠和高效的容器镜像存储和分发服务。以下是关于Docker私有仓库Harbor的详细介绍: 一、Harbor的特点 基于角色的访问控制(RBAC)&#…...

48. 旋转图像/240. 搜索二维矩阵 II
48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 : 输入:matrix [[5,1,9,11],[2,4,…...

wsl安装Xfce桌面并设置系统语言和输入法
一、安装xfce (有相关的依赖都会安装) sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务: sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…...

短信清空了!华为手机短信删除了怎么恢复?
“有没有人知道这是怎么回事呀,原先有一千多条未读一直放着没管,昨天根本没打开短信这个软件,今晚突然发现只剩一条了,是华为手机自动清理了吗!到底该怎么恢复呀?我真崩溃!” 在日常生活中&…...

Linux实现Flappy bird项目
目录 1、项目介绍 2、功能总结 3、前期准备 3.1 Ncurses库 3.2 信号机制 3.2.1 设置信号响应方式 3.2.2 设置定时器 4、代码实现 4.1 头文件引用及变量、函数定义 4.2 主函数 4.3 curses初始化 4.4 设置定时器 4.5 定时器响应函数 4.6 小鸟控制相关函数 4…...

【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略
创建更加复杂的自定义交易策略 使用交易策略类,创建更复杂的自定义策略开始前的准备工作本节的目标继承Strategy类,创建一个复杂的多因子选股策略策略和回测参数配置,并开始回测 本节回顾 使用交易策略类,创建更复杂的自定义策略 …...

SpringBoot整合SpringScurity权限控制(菜单权限,按钮权限)以及加上SSH实现安全传输
文章目录 项目地址: 一、md5 与 先进的哈希算法的区别1.1. 安全性问题1.2. 设计目的1.3. 功能特性1.4. 适用性1.5. 总结 二、数据传输安全和数据加密实现:2.1 生成证书:2.2、在springboot中进行集成2.2.1 配置证书:2.2.2. 强制使用…...

力扣每日一题119:杨辉三角||
题目 简单 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...