Android kotlin 协程异步async与await介绍与使用

devtools/2024/10/19 11:51:43/

一、介绍

        在kotlin语言中,协程是一个处理耗时的操作,但是很多人都知道同步和异步,但是不知道该如何正确的使用,如果处理不好,看似异步,其实在runBloacking模块中使用的结果是同步的。

针对如何同步和如何异步操作,接下来我会通过案例进行介绍

二、协程suspend

kotlin中,如果方法被修饰了suspend,那么这个方法必须在协程中执行,常见的处理协程的有

GlobalScope和runBlocking。

但是,单层的协程还是会由阻塞的情况

案例1.

fun main() {println("start-------------")runBlocking {val text=GlobalScope.async { testLog("send") }println("text reslut=${text.await()}")println("text reslut mime")}println("end-------------")
}suspend fun testLog(txt: String): String {delay(2500)return "back ${txt}"
}

结果还是按顺序执行了

案例2.

fun main() {println("start-------------")GlobalScope.async {runBlocking {val text=GlobalScope.async { testLog("send") }println("text reslut=${text.await()}")println("text reslut mime")}}println("end-------------")
}suspend fun testLog(txt: String): String {delay(2500)return "back ${txt}"
}

在runBlocking最外层加了一个异步的,结果runblocking没有执行。

案例3.

fun main() {println("start-------------")runBlocking {val text = GlobalScope.async { testLog("send") }async {println("text reslut=${text.await()}")}println("text reslut mime")}println("end-------------")
}suspend fun testLog(txt: String): String {delay(2500)return "back ${txt}"
}

结果:在runBlocking中,async{}模块中进行了等待,进行了异步数据返回。

案例4.

fun main() {println("start-------------")runBlocking {async {println("text reslut 2500=${GlobalScope.async { testLog("send") }.await()}")}async {println("text reslut 1500=${GlobalScope.async { testLog("send",1500) }.await()}")}println("text reslut mime")}println("end-------------")
}suspend fun testLog(txt: String,delays:Long=2500): String {delay(delays)return "back ${txt}"
}

结果:和我们设置的预期一致,耗时完顺手一致。

三、总结

通过以上几个案例,可以发现

1.异步如果不在runBlocking模块中进行,或者runBlocking模块外面再包一层,会引起最里面的模块,甚至方法体不在执行

2.想要异步执行,必须在runBlocking中对异步结果进行异步,否则达不到异步效果,变成了同步

3.整个函数的外面都是一个同步阻塞的,runBlocking一旦执行,下面的代码处于一个等待的状态

4.runBlocking中可以继续嵌套runBlocking异步执行模块。


http://www.ppmy.cn/devtools/23989.html

相关文章

【源码】Spring validation参数校验实现原理总结

Spring validation参数校验系列 1、Spring validation参数校验基本使用 2、Spring validation参数校验之自定义校验规则及编程式校验等进阶篇 3、【源码】Spring validation参数校验原理解析之Controller控制器参数校验中RequestBody参数校验实现原理 4、【源码】Spring va…

c++高级篇(三) ——Linux下IO多路复用之poll模型

poll模型 前言 poll模型与select的实现原理相近,所以绝大数的原理其实可以参考select,我们这里对二者的相同点不做过多探究,如果有需要可以去看一下博主的上一篇文章: c高级篇(二) ——Linux下IO多路复用之select模型 这里我们只…

Jmeter插件技术:性能测试中服务端资源监控

性能测试过程中我们需要不断的监测服务端资源的使用情况,例如CPU、内存、I/O等。 Jmeter的插件技术可以很好的实时监控到服务器资源的运行情况,并以图形化的方式展示出来,非常方便我们性能测试分析。 操作步骤: 1、安装插件管理…

封装形式,进化,DIP封装及键出方法

本文主要讨论芯片封装的主要形式,概念,以及芯片封装的演化,最后以DIP封装为例,分析键出方式。 1-IC封装的形式 IC 封装是指将组成电子器件的各个组成部分,包括半导体芯片、基板、管脚连接线等,按照要求布局…

力扣(leetcode) 407. 接雨水 II 3D接雨水

力扣(leetcode) 407. 接雨水 II 3D接雨水 给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输…

【C语言】文件操作

1、为什么使用文件操作? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持…

手撕C语言题典——移除元素(顺序表)

搭配使用更佳哦~~ 数据结构之顺顺顺——顺序表-CSDN博客 数据结构之顺序表的基本操作-CSDN博客 前面学了顺序表的相关知识,我们来尝试做一下关于顺序表的经典算法题~ 前言 27. 移除元素 - 力扣(LeetCode) 移除元素作为力扣上的一道不算太难…

微信小程序+esp8266温湿度读取

本文主要使用微信小程序显示ESP8266读取的温湿度并通过微信小程序控制LED灯。小程序界面如下图所示 原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息。 个人可免费注册五个微信小程序账号,在微信小程序官…