在科特林 Coroutines 中启动与异步
原文:https://www . geesforgeks . org/launch-vs-async-in-kot Lin-coroutines/
先决条件: 安卓系统上的科特林卡罗廷
科特林团队将花冠定义为“轻质螺纹”。它们是实际线程可以执行的任务。Coroutines 在 1.3 版本中被添加到 Kotlin 中,并且是基于其他语言的既定概念。Kotlin coroutines 引入了一种新的并发风格,可以在 Android 上使用来简化异步代码。
官方文档说 coroutines 是轻量级线程。通过轻量级,* 意味着创建协同程序不会分配新线程。取而代之的是,他们使用预定义的线程池和智能调度来决定接下来执行哪个任务,以及以后执行哪个任务*。
Kotlin 中主要有两个功能来启动协同程序。
- 发射{ }
- 异步{ }
启动功能
启动不会阻塞主线程,但另一方面,代码剩余部分的执行不会等待启动结果,因为启动不是挂起调用。以下是使用启动的柯特林程序:
我的锅
// Kotlin Program For better understanding of launch
fun GFG()
{
var resultOne = "Android"
var resultTwo = "Kotlin"
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"
Log.i("Launch", message)
return message
}
suspend fun function2(): String
{
delay(100L)
val message = "function2"
Log.i("Launch", message)
return message
}
当你在安卓 IDE 中运行代码时,日志结果会是:
我的锅
// 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
}
由于fetchusareandsavindabase()没有返回任何东西,我们可以使用启动来完成该任务,然后在主线程上做一些事情。
何时使用发射?
可以在用户不想使用返回结果的地方使用 Launch,返回的结果将在以后执行一些其他工作时使用。例如,它可以在涉及更新或改变颜色等任务的地方使用,因为在这种情况下返回的信息将毫无用处。
异步功能
Async 也用于启动 coroutines,但是它在程序中 await() 函数的入口点阻塞主线程。下面是一个使用异步的柯特林程序:
我的锅
// kotlin program for demonstration of async
fun GFG
{
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"
Log.i("Async", message)
return message
}
suspend fun function2(): String
{
delay(100L)
val message = "function2"
Log.i("Async", message)
return message
}
需要注意的一点是,Async 并行调用 result1 和 result2 两个网络,而对于 launch,不进行并行函数调用。当你在安卓 IDE 中运行代码时,日志结果会是:
何时使用异步?
当并行进行两个或多个网络调用时,但是您需要在计算输出之前等待答案,即使用 async 处理并行运行的多个任务的结果。如果您使用异步,不等待结果,它将与启动完全相同。
差异表
下表列出了启动和异步之间的差异: