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")      //1
        launch {
            delay(1000)
            Log.i("test_coroutine","我是一个coroutineScope 里的 launch")  // 4
            delay(1000)
            Log.i("test_coroutine","我是一个coroutineScope 里的 launch1")  //5
        }

        Log.i("test_coroutine","我是一个coroutineScope1")  // 2
        Log.i("test_coroutine","我是一个coroutineScope2")  // 3
    }

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

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

        Log.i("test_coroutine","我是一个coroutineScope1")  //2
        delay(1500)                                          //多了个delay
        Log.i("test_coroutine","我是一个coroutineScope2")  //4
    }

结果
在这里插入图片描述

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

        Log.i("test_coroutine","我是一个coroutineScope1")  //2
        job1.join()
        delay(1500)                                          //多了个delay
        Log.i("test_coroutine","我是一个coroutineScope2")  //5
    }

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

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

        Log.i("test_coroutine","我是一个coroutineScope1")  //2
        delay(1500)                                          //多了个delay
        Log.i("test_coroutine","我是一个coroutineScope2")  //4
        cancel()
    }

结果 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)                                          //多了个delay
        Log.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 = 0
            while(i<10){
                yield()
                delay(500)
                Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")
            }
        }

        Log.i("test_coroutine","我是一个coroutineScope1")
        delay(1500)                                          //多了个delay
        Log.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 = 0
            while(i<10){
                yield()
                delay(500)
                Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")
            }
        }

        Log.i("test_coroutine","我是一个coroutineScope1")
        delay(1500)                                          //多了个delay
        Log.i("test_coroutine","我是一个coroutineScope2")
        job1.cancelAndJoin()
        Log.i("test_coroutine","我是一个coroutineScope3")
    }

结果
在这里插入图片描述

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

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

  • async

 val async = async {
            var i = 0
            while(i<10 && isActive){
                delay(500)
                Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")
            }
            "完事啦"
        }


        Log.i("test_coroutine","我是一个coroutineScope1")
        delay(1500)                                          //多了个delay
        Log.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 = 0
            while(i<10 && isActive){
                delay(500)
                Log.i("test_coroutine","我是一个coroutineScope 里的 launch>>${i++}")
            }
        }


        Log.i("test_coroutine","我是一个coroutineScope1")
        delay(1500)                                          //多了个delay
        Log.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 = currentComposer
    val 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《python编程从入门到实践》day38

# 昨日知识点回顾 定义、迁移模型Entry # 今日知识点学习 18.2.7 Django shell 每次修改模型后&#xff0c;看到重启后的效果需要重启shell&#xff0c;退出shell会话Windows系统按ctrlZ或者输入exit() 18.3 创建页面&#xff1a;学习笔记主页 创建页面三阶段&#xf…

Postgresql源码(133)优化器动态规划生成连接路径的实例分析

物理算子的生成分为两步&#xff0c;基表的扫描路径生成set_base_rel_pathlists&#xff1b;连接路径生成&#xff08;make_rel_from_joinlist动态规划&#xff09;。本篇简单分析实现。看过代码会发现&#xff0c;“基表的扫描路径生成”其实就是作为连接路径生成dp计算的第一…

【Redis】 关于 Redis 哈希类型

文章目录 &#x1f343;前言&#x1f38b;命令介绍&#x1f6a9;hset&#x1f6a9;hget&#x1f6a9;hexists&#x1f6a9;hdel&#x1f6a9;hkeys&#x1f6a9;hvals&#x1f6a9;hgetall&#x1f6a9;hmget&#x1f6a9;hlen&#x1f6a9;hsetnx&#x1f6a9;hincrby&#x1…

快速分析变量间关系(Boruta+SHAP+RCS)的 APP(streamlit)

快速分析变量间关系&#xff08;BorutaSHAPRCS&#xff09;的 APP&#xff08;streamlit&#xff09; 以下情况下&#xff0c;你需要这个快速分析的APP: 正式分析之前的预分析&#xff0c;有助于确定分析的方向和重点变量&#xff1b;收集变量过程中&#xff0c;监测收集的变量…

如果突然失业,靠这个项目也能养活自己,6天收入3K

在前两天&#xff0c;我与两位好友相约外出就餐。当时正值雨天&#xff0c;我们便选择了一家大排档&#xff0c;边品尝美食边畅谈人生。聊得尽兴&#xff0c;直到凌晨一点多才回到家中。其中一位朋友最近刚刚遭遇裁员&#xff0c;为了寻找新的工作机会&#xff0c;他已经经历了…

简要的谈谈MySQL存储引擎

MySQL存储引擎 一、先从总体架构说起二、引擎介绍1.存储引擎2.如何更改数据库表引擎3.常用引擎及其特性对比4.如何选择不同类型的引擎 一、先从总体架构说起 1.MySQL架构就是一个客户端-服务器系统。架构可以分为Server层 和 Engine层两部分 连接器&#xff1a;连接器负责跟客…

【AI大模型】这可能是最简单的本地大模型工具,无须部署,一键使用

目录 前言 LM-Studio​编辑 那么问题来了&#xff0c;为什么我要在本地部署大模型&#xff1f; 隐私性&#xff1a; 定制性&#xff1a; 成本和体验的优化&#xff1a; 工具功能特点和使用方式介绍&#xff1a; 首页提供搜索功能和一些模型的推荐 模型下载管理&#x…

深入理解内联函数(C语言)

目录 1.什么是内联函数2.内联函数与宏3.编译器对内联函数的处理4.参考文献 1.什么是内联函数 很多人都会知道&#xff0c;可以将比较小的函数写成内联函数的形式&#xff0c;这样会节省函数调用的开销&#xff0c;具体是什么样的开销呢&#xff1f; 一个函数在执行过程中&…

Stable Diffusion——U-ViT用于扩散建模的 ViT 主干网

1.概述 扩散模型是最近出现的强大的深度生成模型&#xff0c;可用于生成高质量图像。扩散模型发展迅速&#xff0c;可应用于文本到图像生成、图像到图像生成、视频生成、语音合成和 3D 合成。 除了算法的改进&#xff0c;骨干网的改进在扩散建模中也发挥着重要作用。一个典型…

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

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

Dubbo源码及总结

Springboot整合Dubbo启动解析Bean定义 根据springboot启动原理&#xff0c;会先把启动类下的所有类先进行解析bean定义&#xff0c;所以要先EnableDubbo这个注解&#xff0c;再根据这个注解里面的注解&#xff0c;可以知道import的两个类DubboComponentScanRegistrar和DubboCo…

【408精华知识】主存相关解题套路大揭秘!

讲完了Cache&#xff0c;再来讲讲主存是怎么考察的&#xff0c;我始终认为&#xff0c;一图胜千言&#xff0c;所以对于很多部件&#xff0c;我都是通过画图进行形象的记忆&#xff0c;那么接下来我们对主存也画个图&#xff0c;然后再来详细解读其考察套路~ 文章目录 零、主存…

结构体;结构成员访问操作符

结构体&#xff1a; 虽然c语言已经提供了内置类型&#xff0c;比如&#xff1a;char、short、int、long等&#xff0c;但还是不够用&#xff0c;就好比我描述一个人&#xff0c;我需要描述他的身高&#xff0c;体重&#xff0c;年龄&#xff0c;名字等信息&#xff0c…

类与对象:接口

一.概念 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xff0c;在JAVA编程语言中是一个抽象类型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface来声明。 二.语法规则 与定义类相似&#xff0c;使用interface关键词。 Idea可以在开始时直接创建…

《计算机网络微课堂》1-6 计算机体系结构

常见的计算机网络体系结构 从本节课开始&#xff0c;我们要用 4 次课的时间来介绍有关计算机网络体系结构的知识&#xff0c;具体包含以下内容&#xff1a; 一&#xff0c;常见的计算机网络体系结构二&#xff0c;计算机网络体系结构分层的必要性三&#xff0c;计算机网络体系…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

力扣刷题---2418. 按身高排序【简单】

题目描述 给你一个字符串 数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 示例 1&…

力扣刷题---961. 在长度 2N 的数组中找出重复 N 次的元素【简单】

题目描述&#x1f357; 给你一个整数数组 nums &#xff0c;该数组具有以下属性&#xff1a; nums.length 2 * n. nums 包含 n 1 个 不同的 元素 nums 中恰有一个元素重复 n 次 找出并返回重复了 n 次的那个元素。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,3] 输…

微服务中使用Maven BOM来管理你的版本依赖

摘要: 原创出处 sf.gg/a/1190000021198564 「飘渺Jam」欢迎转载&#xff0c;保留摘要&#xff0c;谢谢&#xff01; 为什么要使用BOM? 如何定义BOM? 项目使用方法? BOM&#xff08;Bill of Materials&#xff09;是由Maven提供的功能,它通过定义一整套相互兼容的jar包版…

93.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-增强技能信息显示后进行分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…