41. 协程中的launch 和 async (OpenAI翻译)
创始人
2025-05-29 08:43:07

在本文中,我们将学习Kotlin协程中的“launch”和“async”的区别,以及何时使用它们。
“launch”和“async”都是在Kotlin中启动协程的函数。

launch{}

async{}

它们之间的不同之处在于,“launch{}”返回一个“Job”对象,不传递任何结果值,而“async{}”返回一个“Deferred”实例,它有一个“await()”函数,返回协程的结果,就像Java中的Future一样,在其中我们使用future.get()来获取结果。

换句话说:

  • “launch”:启动并忘记。
  • “async”:执行任务并返回结果。
    让我们拿一个例子来学习“launch”和“async”的区别。

我们可以如下使用“launch”:

val job = GlobalScope.launch(Dispatchers.Default) {// do something and do not return result
}

“launch”返回一个“Job”对象,我们可以使用它来获取任务的状态或取消任务执行。

在上面“launch”的例子中,我们需要做某些事情,但不需要将结果返回。

但是,当我们需要返回结果时,我们需要使用“async”。

val deferredJob = GlobalScope.async(Dispatchers.Default) {// do something and return result, for example 10 as a resultreturn@async 10
}
val result = deferredJob.await() // result = 10

接下来,我们将使用await()获取结果。

在“async”中,我们也可以使用Deferred job对象来获取任务的状态或取消它。

注意:我在快速示例中使用了GlobalScope,我们应该尽量避免使用它。在Android项目中,我们应该根据我们的用例使用自定义范围,如lifecycleScope、viewModelScope等。

“launch”和“async”的另一个区别是异常处理。

如果在“launch”块中出现任何异常,如果我们没有处理它,则会导致应用程序崩溃。

但是,如果在“async”块中出现任何异常,则它将存储在生成的“Deferred”中,并且不会传递到其他任何地方,它将被默默地丢弃,除非我们对其进行处理。

让我们通过代码示例理解这个区别。

假设我们有一个函数执行某个操作并抛出异常:

private fun doSomethingAndThrowException() {throw Exception("Some Exception")
}

现在我们使用“launch”调用它:

GlobalScope.launch {doSomethingAndThrowException()
}

如预期的那样,这将导致应用程序崩溃。

我们可以通过以下方式处理它:

GlobalScope.launch {try {doSomethingAndThrowException()} catch (e: Exception) {// handle exception}
}

现在,异常将进入catch块,我们可以处理它。

现在我们使用“async”调用它:

GlobalScope.async {doSomethingAndThrowException()
}

应用程序不会崩溃。异常将被静默地丢弃。

同样,我们可以通过以下方式处理它:

GlobalScope.async {try {doSomethingAndThrowException()} catch (e: Exception) {// handle exception}
}

现在,异常将进入catch块,我们可以处理它。

让我总结一下“launch”和“async”的区别:

LaunchAsync
Fire and forget.执行任务并返回结果
launch{}返回一个Job,不携带任何结果值。async{}返回一个Deferred的实例,它有一个await()函数来返回coroutine的结果。
如果在启动块中出现任何异常,如果我们没有处理它,就会使应用程序崩溃。如果任何异常出现在异步块内,它将被存储在产生的递延内,不会被传递到其他地方,除非我们处理它,否则它将被默默地丢弃。

所以,我们已经了解了启动函数和异步函数之间的区别。

原文链接

相关内容

热门资讯

Pr 复古胶片老电影回忆效果 哈喽,各位小伙伴!今天我们来学习一下如何制作复古胶片老电影回忆效果&#x...
【STM32学习】WWDG窗口... 【STM32学习】WWDG窗口看门狗🐕1、图展示WWDG原理2、复位、中断条件3、溢...
瑞祥是什么意思(瑞祥是什么意思... 今天给各位分享瑞祥是什么意思的知识,其中也会对瑞祥是什么意思?进行解释,如果能碰巧解决你现在面临的问...
黄鼠狼的天敌(黄鼠狼的天敌是什... 今天给各位分享黄鼠狼的天敌的知识,其中也会对黄鼠狼的天敌是什么动物百度百科进行解释,如果能碰巧解决你...
famous怎么读(famou... 今天给各位分享famous怎么读的知识,其中也会对famous怎么读英语进行解释,如果能碰巧解决你现...
中国奉行什么的国防政策(中国奉... 本篇文章极速百科给大家谈谈中国奉行什么的国防政策,以及中国奉行的是什么样的国防政策?对应的知识点,希...
【Hello Linux】进程... 作者:@小萌新 专栏:@Linux 作者简介࿱...
STM32F103指南者开发板... 1 前言 使用STM32F103指南者开发板,安装了Keil5,使用St...
二维数组的表现及应用 1 问题在Java数组中,数组是一种常遇见的表现形式。对于一维数组在最近的学习已经非常...
《程序员面试金典(第6版)》面... 题目描述 给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(...
什么叫丹霞地貌(中国七大丹霞景... 本篇文章极速百科给大家谈谈什么叫丹霞地貌,以及中国七大丹霞景区对应的知识点,希望对各位有所帮助,不要...
白色骐达mdashmdash好... 今天给各位分享白色骐达mdashmdash好看实用的两箱车的知识,其中也会对白色骐达改装图片进行解释...
裤子尺码28是多大(裤子尺码2... 本篇文章极速百科给大家谈谈裤子尺码28是多大,以及裤子尺码28是多大码对应的知识点,希望对各位有所帮...
进口奔驰s300价格多少(进口... 今天给各位分享进口奔驰s300价格多少的知识,其中也会对进口奔驰s300价格多少钱一辆进行解释,如果...
Keras 的模型(Model... 我们来做个 TensorFlow 的快速入门模型分享。 这次的学习目标就是模型构建的一些相关 API...
串行通信协议(I2C、SPI、... I2C(Inter-Integrated Circuit) 1.简单的双向两线制总线协议标准、半双...
石化团购:放价不打烊,14个汽... 今天给各位分享石化团购:放价不打烊,14个汽车品牌请您挑选!的知识,其中也会对石化团购的商品是真的吗...
tf金箔润唇膏是不是死亡芭比粉... 今天给各位分享tf金箔润唇膏是不是死亡芭比粉的知识,其中也会对tom ford金箔唇膏进行解释,如果...
日本也开始山寨了?造最强悍马,... 本篇文章极速百科给大家谈谈日本也开始山寨了?造最强悍马,比美国的还大一号!,以及日本山寨历史对应的知...
走应急车道一天内最多罚几次?应... 今天给各位分享走应急车道一天内最多罚几次?应急车道抓拍原理的知识,其中也会对应急车道行驶多久会被拍进...
代码分支管理:主干发布分支开发... 大家好,我是rainbowzhou。 上篇文章代码分支管理中,我介绍了3...
蓝桥杯C++组怒刷50道真题(... 🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 ...
2015款林肯MKX空间怎么样... 本篇文章极速百科给大家谈谈2015款林肯MKX空间怎么样林肯MKX购车手册,以及2015款林肯mkx...
夏利n7怎么样能买么?的简单介... 今天给各位分享夏利n7怎么样能买么?的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘...
特斯拉宣布已在中国建立数据中心... 本篇文章极速百科给大家谈谈特斯拉宣布已在中国建立数据中心,以实现数据存储本地...,以及特斯拉中国数...
算法--最长回文子串--jav... 这个算法题里面总是有 暴力解法 把所有字串都拿出来判断一下 这里有小小的优化: 就是当...
雷凌豪华版混动:外观空间出色,... 本篇文章极速百科给大家谈谈雷凌豪华版混动:外观空间出色,动力油耗佳,操控稳定...,以及雷凌豪华版混...
时序预测 | MATLAB实现... 时序预测 | MATLAB实现NARX非线性自回归外生模型和MLP多层感知器预测比较 目录 时序...
字符串函数的模拟实现 文章目录前言函数介绍strlen 函数strcpy 函数strcat 函数strcmp函数strnc...
3月13~19日学习总结 关于Jenetics库的学习 这是一个开源的遗传算法库,可以使用maven直接引入的项...