Android kotlin协程

说明

  • 可代替线程整异步
  • 可控制,灵活 (控制优先级,内存占用等)
  • 速度快 效率高
  • 有数量上限

使用

  • runBlocking 一般用于测试 不建议使用
  • GlobalScope.launch 全局的 生命周期跟随application 不建议使用
  • CoroutineScope(job) 用
    基本使用
  runBlocking {Log.i("test_coroutine","我是一个runBlocking")}Log.i("test_coroutine","我在 runBlocking 协程外 且在 协程后")GlobalScope.launch {Log.i("test_coroutine","我是一个GlobalScope")}Log.i("test_coroutine","我在 GlobalScope 协程外 且在 协程后")val job = Job()val coroutineScope = CoroutineScope(job)coroutineScope.launch {Log.i("test_coroutine","我是一个coroutineScope")}Log.i("test_coroutine","我在 coroutineScope 协程外 且在 协程后")

结果
在这里插入图片描述
分析

runBlocking 阻塞主线程 执行了协程后 继续执行

GlobalScope.launch 不阻塞 继续执行主线程 后执行协程
coroutineScope.launch 不阻塞 继续执行主线程 后执行协程

  • 增加延时,效果更明显 delay(1000)
  runBlocking {delay(1000)Log.i("test_coroutine","我是一个runBlocking")}Log.i("test_coroutine","我在 runBlocking 协程外 且在 协程后")GlobalScope.launch {delay(1000)Log.i("test_coroutine","我是一个GlobalScope")}Log.i("test_coroutine","我在 GlobalScope 协程外 且在 协程后")val job = Job()val coroutineScope = CoroutineScope(job)coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")}Log.i("test_coroutine","我在 coroutineScope 协程外 且在 协程后")

结果
在这里插入图片描述
分析

runBlocking 阻塞主线程 执行了协程后 继续执行

GlobalScope.launch 协程内容最后执行
coroutineScope.launch 协程内容最后执行

1.1 协程里的挂起

 val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")      //1launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch")  // 4delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch1")  //5}Log.i("test_coroutine","我是一个coroutineScope1")  // 2Log.i("test_coroutine","我是一个coroutineScope2")  // 3}

结果
在这里插入图片描述
继续玩

 val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")   //1launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch")  //3delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch1")  //5}Log.i("test_coroutine","我是一个coroutineScope1")  //2delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")  //4}

结果
在这里插入图片描述

  • join()
 val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")  //1val job1 = launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch")  //3delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch1")  //4}Log.i("test_coroutine","我是一个coroutineScope1")  //2job1.join()delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")  //5}

结果: 执行的时候 job1加入了进来
在这里插入图片描述

  • cancel()
 val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")  //1val job1 = launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch")  //3delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch1")  //不执行}Log.i("test_coroutine","我是一个coroutineScope1")  //2delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")  //4cancel()}

结果 job 和 子job1都停了
在这里插入图片描述

  • job1.cancel()
 val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")val job1 = launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch")delay(1000)Log.i("test_coroutine","我是一个coroutineScope 里的 launch1")}Log.i("test_coroutine","我是一个coroutineScope1")delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")job1.cancel()Log.i("test_coroutine","我是一个coroutineScope3")}

结果 job继续执行 job1停了
在这里插入图片描述

  • job1.cancelAndJoin() 执行完之后 取消
  val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")val job1 = launch {var i = 0while(i<10){yield()delay(500)Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")}}Log.i("test_coroutine","我是一个coroutineScope1")delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")job1.join()job1.cancel()Log.i("test_coroutine","我是一个coroutineScope3")}

结果 job1并没有被取消
在这里插入图片描述

  • job1.cancelAndJoin()
   val coroutineScope = CoroutineScope(Job())val job = coroutineScope.launch {delay(1000)Log.i("test_coroutine","我是一个coroutineScope")val job1 = launch {var i = 0while(i<10){yield()delay(500)Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")}}Log.i("test_coroutine","我是一个coroutineScope1")delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")job1.cancelAndJoin()Log.i("test_coroutine","我是一个coroutineScope3")}

结果
在这里插入图片描述

  • ensureActive() 在协程不在 active 状态时会立即抛出异常。

  • yield() yield 会进行的第一个工作就是检查任务是否完成,如果 Job 已经完成的话,就会抛出 CancellationException 来结束协程。yield 应该在定时检查中最先被调用

  • async

 val async = async {var i = 0while(i<10 && isActive){delay(500)Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")}"完事啦"}Log.i("test_coroutine","我是一个coroutineScope1")delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")val result = async.await()Log.i("test_coroutine","我是一个coroutineScope3 result>"+result)Log.i("test_coroutine","我是一个coroutineScope4")

结果
在这里插入图片描述

  • withTimeout
 Log.i("test_coroutine","我是一个coroutineScope")withTimeout(3000){var i = 0while(i<10 && isActive){delay(500)Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")}}Log.i("test_coroutine","我是一个coroutineScope1")delay(1500)                                          //多了个delayLog.i("test_coroutine","我是一个coroutineScope2")

结果 时间到后所在的协程也不继续执行了
在这里插入图片描述

Android中的协程

  • MainScope
MainScope().launch {}
  • viewModelScope
    implementation ‘androidx.lifecycle:lifecycle-viewmodel-android:2.8.0’
    implementation ‘androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0’
    implementation ‘androidx.lifecycle:lifecycle-common:2.8.0’
 viewModelScope.launch {}
  • lifecycleScope
  lifecycleScope.launch {}

在这里插入图片描述

  • rememberCoroutineScope() 可能会因为组件状态变化而移除此协程
@Composable
inline fun rememberCoroutineScope(crossinline getContext: @DisallowComposableCalls () -> CoroutineContext ={ EmptyCoroutineContext }
): CoroutineScope {val composer = currentComposerval wrapper = remember {CompositionScopedCoroutineScopeCanceller(createCompositionCoroutineScope(getContext(), composer))}return wrapper.coroutineScope
}
  • currentRecomposeScope currentRecomposeScope 是一个在任何Composable函数中都能访问的成员
    作用是使当前时刻组合无效,强制触发重组
val currentRecomposeScope: RecomposeScope@ReadOnlyComposable@OptIn(InternalComposeApi::class)@Composable get() {val scope = currentComposer.recomposeScope ?: error("no recompose scope found")currentComposer.recordUsed(scope)return scope}
  • supervisorScope 协程异常不影响其他协程
  • coroutineScope 有异常所有携程都退出

本文参考 https://blog.csdn.net/Code1994/article/details/129448142

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

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

相关文章

GEE批量导出逐日、逐月、逐季节和逐年的遥感影像(以NDVI为例)

影像导出 1.逐日数据导出2.逐月数据导出3.季节数据导出4.逐年数据导出 最近很多小伙伴们私信我&#xff0c;问我如何高效导出遥感数据&#xff0c;从逐日到逐季度&#xff0c;我都有一套自己的方法&#xff0c;今天就来和大家分享一下&#xff01;   &#x1f50d;【逐日导出…

Scala 入门介绍和环境搭建

一、简介 Scala 是一门以 Java 虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 (静态语言需要提前编译&#xff0c;如&#xff1a;Java、c、c 等&#xff0c;动态语言如&#xff1a;js)Scala 是一门多范式的编程…

【介绍下Pwn,什么是Pwn?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

冯喜运:5.25黄金价格和原油价格加速看跌?未来如何走势?

【黄金消息面分析】&#xff1a;本周黄金市场经历剧烈波动&#xff0c;金价创下五个半月来最糟糕的单周表现&#xff0c;尽管周五因美元下跌小幅回升。美联储的鹰派立场和美国经济数据强劲削弱了降息预期&#xff0c;导致金价承压。然而&#xff0c;分析师对未来金价走势看法不…

Rolla‘s homework:Image Processing with Python Final Project

对比学习Yolo 和 faster rcnn 两种目标检测 要求 Image Processing with Python Final Project Derek TanLoad several useful packages that are used in this notebook:Image Processing with Python Final Project Project Goals: • Gain an understanding of the object …

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车&#xff0c;然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例&#xff1a; 3、继续回车&#xff0c;然后会看到以下字眼 Enter…

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

【面试干货】数据库乐观锁&#xff0c;悲观锁的区别&#xff0c;怎么实现 1、乐观锁&#xff0c;悲观锁的区别2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、乐观锁&#xff0c;悲观锁的区别 悲观锁&#xff08;Pessimistic Lo…

web前端框架设计第十课-组件

web前端框架设计第十课-组件 一.预习笔记 组件&#xff1a;Vue最强大的功能之一 1.局部组件注册 注意事项&#xff1a;template标签中只能有一个根元素 2.全局组件的注册 注意事项&#xff1a;组件名的大小写需要注意&#xff08;实践&#xff09; 3.案例&#xff08;查询框…

Vivado 使用教程(个人总结)

Vivado 是 Xilinx 公司推出的一款用于 FPGA 设计的集成开发环境 (IDE)&#xff0c;提供了从设计输入到实现、验证、调试和下载的完整流程。本文将详细介绍 Vivado 的使用方法&#xff0c;包括项目创建、设计输入、约束文件、综合与实现、仿真、调试、下载配置等步骤。 一、创建…

HCIP-VLAN综合实验

一、实验拓扑 二、实验要求 1、pc1和pc3所在接口为access;属于vlan 2; PC2/PC4/PC5/PC6处于同一网段’其中PC2可以访问PC4/PC5/PC6; PC4可以访问PC6&#xff1b;PC5不能访问PC6&#xff1b; 2、PC1/PC3与PC2/PC4/PC5/PC6不在同一个网段&#xff1b; 3、所有PC通过DHCP获取IP…

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版&#xff0c;它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台&#xff0c;所以它没有 .NET FrameWork 的历史包袱&#xff0c;相对于 .NET FrameWork&#xff0c;它具备很多优势。 .NET Core 有哪些优势&am…

C# GDI+ 绘制文字不同的操作系统渲染文字大小不同

一、C# GDI 绘制文字不同的操作系统渲染文字大小不同 原因&#xff1a;使用Font 字体的时候&#xff0c;没有指定字体渲染的单位。 不同系统的默认字体单位会不同。 二、解决方案&#xff1a; 在指定字体的时候&#xff0c;指定字体大小&#xff0c;同时也要设置字体的单位 …

sqlserver 创建表,列及表,列描述

-- 创建表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName NVARCHAR(100),EmployeeEmail NVARCHAR(100) );-- 为表添加描述 EXEC sp_addextendedproperty name NMS_Description, value N员工信息表, level0type NSchema, level0name dbo, level1type N…

springboot整合kkFileView部署,前端使用

前言&#xff1a; 官方文档&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html docker方式或加入星球获取发行包直接获取启动&#xff0c;无需以下步骤&#xff1a; 拉取镜像# 网络环境方便访问docker中央仓库 docker pull keking/kkfileview:4.1.0# 网…

二元关系表示

一、二元关系的定义和表示 什么是二元关系&#xff1f;对集合A和B&#xff0c;A\timesB的任意子集R为A到B的一个二元关系。当AB时&#xff0c;A\timesA的任一子集R称为A上的一个二元关系。在不引起误解的情况下&#xff0c;二元关系可简称关系。 若|A|m,|B|n&#xff0c;则A到…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代&#xff0c;人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天&#xff0c;AI写作软件的出现&#xff0c;让很多自媒体创作者都会想到在手机上面进内容创作&#xff0c;这样不仅能提高工作效率&#xff0c;而且工作的自由度会更高…

自动化运维(AIOps): 现代IT管理的革命

在数字化时代&#xff0c;企业的 IT 系统变得愈加复杂。从云计算到大数据&#xff0c;从物联网到人工智能&#xff0c;技术的飞速发展使得企业面临前所未有的挑战。这种复杂性不仅体现在数据量和数据流的增加上&#xff0c;还包括高成本和高错误率的运维需求。在此背景下&#…

基于51单片机的盆栽自动浇花系统

一.硬件方案 工作原理是湿度传感器将采集到的数据直接传送到ADC0832的IN端作为输入的模拟信号。选用湿度传感器和AD转换&#xff0c;电路内部包含有湿度采集、AD转换、单片机译码显示等功能。单片机需要采集数据时&#xff0c;发出指令启动A/D转换器工作&#xff0c;ADC0832根…

Android 实现竖排文本(垂直方向显示)

Android 实现竖排文本-垂直方向显示 前言效果图代码实现方式一 Custom View1. 自定义视图 VerticalTextView2. 在xml布局文件中使用3. 设置文本内容 方式二 使用 TextView 的 rotation属性方式三 使用带有跨距文本的TextView1. 自定义视图 VerticalTextView2. 在xml布局文件中使…

【Windows系统】解决Intel 6代CPU安装win7系统过程中无法操作键盘鼠标的问题

问题 微软表示&#xff0c;从 2016 年 7 月 17 日起&#xff0c;新的 Intel、AMD 和Qualcomm 处理器将仅支持 Windows 10&#xff0c;不再支持 Windows 7 和 8.1。因此&#xff0c;Intel 6代以后的CPU因为没有USB驱动无法完成win7系统的安装。 下文核心思想是通过老毛桃PE系统…