Kotlin协程中的启动和异步
admin
2023-07-30 20:21:02
0

Kotlin团队将coroutines定义为 “轻型线程”。它们是一种实际线程可以执行的任务。Coroutines在1.3版本中被添加到Kotlin中,是基于其他语言的既定概念。Kotlin Coroutines引入了一种新的并发方式,可以在Android上使用,以简化异步代码。

官方文档解释:coroutines是轻量级线程。所谓轻量级,是指创建coroutines并不分配新的线程。相反,它们使用预定义的线程池和智能调度,以达到下一步执行哪个任务和以后执行哪个任务的目的。

在Kotlin中主要有两个函数来启动 coroutines :

  • launch{ }
  • async{ }

launch函数

Launch不会阻塞主线程,但另一方面,由于Launch不是一个挂起的调用,代码的其余部分的执行不会等待Launch的结果。以下是一个使用Launch的Kotlin程序。

// Kotlin Program For better understanding of launch
fun YiibaiDemo()
{
    var resultOne = "Android"\\n    var resultTwo = "Kotlin"\\n    Log.i("Launch", "Before")
    launch(Dispatchers.IO) { resultOne = function1() }
    launch(Dispatchers.IO) { resultTwo = function2() }
    Log.i("Launch", "After")
    val resultText = resultOne + resultTwo
    Log.i("Launch", resultText)
}

suspend fun function1(): String
{
    delay(1000L)
    val message = "function1"\\n    Log.i("Launch", message)
    return message
}

suspend fun function2(): String
{
    delay(100L)
    val message = "function2"\\n    Log.i("Launch", message)
    return message
}

示例2:

// pseudo kotlin code for demonstration of launch
GlobalScope.launch(Dispatchers.Main)
{
// do on IO thread
fetchUserAndSaveInDatabase()
}

suspend fun fetchUserAndSaveInDatabase()
{
// fetch user from network
// save user in database
// and do not return anything
}

由于fetchUserAndSaveInDatabase()没有返回任何东西,可以使用启动来完成该任务,然后在主线程上做一些事情。

什么时候使用Launch?
Launch可以用在用户不想使用返回的结果的地方,这些结果后来被用于执行一些其他工作。例如,它可以用在涉及更新或改变颜色等任务的地方,因为在这种情况下,返回的信息是没有用的。

Async函数

Async也被用来启动循环线程,但它在程序中的await()函数的入口处阻塞主线程。以下是一个使用Async的Kotlin程序。

// kotlin program for demonstration of async
fun YiibaiDemo
{
Log.i("Async", "Before")
val resultOne = Async(Dispatchers.IO) { function1() }
val resultTwo = Async(Dispatchers.IO) { function2() }
Log.i("Async", "After")
val resultText = resultOne.await() + resultTwo.await()
Log.i("Async", resultText)
}

suspend fun function1(): String
{
delay(1000L)
val message = "function1"\\nLog.i("Async", message)
return message
}

suspend fun function2(): String
{
delay(100L)
val message = "function2"\\nLog.i("Async", message)
return message
}

下面是Launch和Async的区别表。

Launch Async
launch 基本上是发射和遗忘。 Async基本上是执行一个任务并返回一个结果。
launch{}不返回任何东西。async{ } 它有一个await()函数,返回coroutine的结果。
当需要平行执行网络调用时,不能使用 launch{}。 只有当需要并行执行网络调用时,才使用async。
launch{}不会阻塞你的主线程。 Async将在await()函数的入口处阻塞主线程。
代码的其他部分的执行将不会等待启动的结果 因为启动不是一个暂停调用代码的其他部分的执行将不得不等待await()函数的结果。
在任何情况下或条件下,发射都不可能像async那样工作。 如果使用async并且不等待结果,它的工作方式将与启动完全相同。
如果不需要所调用方法的结果,可以在一些地方使用Launch。 当需要平行运行的多个任务的结果时,使用async。
例如:它可以用在涉及到更新或改变颜色等任务的地方,比如获取用户并保存在数据库中。 例子:想象一下,当必须通过使用两个并行的网络调用从数据库中获取两个用户的数据,然后根据他们的数据来计算一些结果。

相关内容

Ada:在公共函数的前提条...
在公共函数的前提条件中使用私有变量,可以通过以下解决方法:使用访问...
2024-05-24 01:13:20
Ada中是否支持固定点数据...
Ada提供了针对固定点数据类型的“标准”基本函数,这些函数在Ada...
2024-05-24 01:09:38
ada中的布尔函数出现'p...
在使用布尔函数时,可能会出现上述两个错误。为了修正这些错误,需要检...
2024-05-24 01:05:48
Ada中的函数操作符有什么...
Ada中的函数操作符是一种语法特性,用于简化函数式编程中的代码书写...
2024-05-24 01:04:13
Ada语言 - 如何存储由...
在Ada语言中,可以使用指针和动态分配的内存来存储由函数返回的字符...
2024-05-24 01:01:58
Adam优化器不能应用在损...
在使用Adam优化器时,必须确保损失函数的输出为标量,不能是一个向...
2024-05-24 00:34:24

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 常见... 什么是 Apache Doris Apache Doris 是一款 MPP 架构的 OLAP 列式存...
Vmware简易安装ubunt... 大晚上的折腾死我了VMware安装ubuntu,用简易安装结果设置的用户名密码死活进不去再重装一次,...
‘WebDriver‘ obj... selenium库报错"‘WebDriver’ object has no attribute ‘f...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
WiFi中继器和WiFi扩展器... WiFi中继器以无线方式连接到 WiFi 网络并重新广播信号。它就像一个中继系统,连接到我们的 Wi...