Kotlin协程中的启动和异步
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。 |
例如:它可以用在涉及到更新或改变颜色等任务的地方,比如获取用户并保存在数据库中。 | 例子:想象一下,当必须通过使用两个并行的网络调用从数据库中获取两个用户的数据,然后根据他们的数据来计算一些结果。 |