推荐答案
在 Kotlin 协程中,launch 和 async 是两种常用的协程构建器,它们的主要区别在于返回值和处理方式:
launch:用于启动一个不需要返回结果的协程。它返回一个Job对象,可以通过该对象来控制协程的生命周期(如取消协程)。launch通常用于执行一些不需要返回值的后台任务。async:用于启动一个需要返回结果的协程。它返回一个Deferred对象,该对象是Job的子类,可以通过调用await()方法来获取协程的执行结果。async通常用于并发执行多个任务并等待它们的结果。
本题详细解读
launch 的使用场景
launch 适用于那些不需要返回结果的任务,例如后台任务、日志记录、UI 更新等。由于它不返回结果,因此通常用于执行一些“即发即忘”的操作。
val job = GlobalScope.launch {
// 执行一些不需要返回结果的操作
delay(1000)
println("Task completed")
}
// 可以通过 job 对象来控制协程的生命周期
job.cancel()async 的使用场景
async 适用于那些需要返回结果的任务,例如并发执行多个网络请求并等待所有请求完成后再进行下一步操作。async 返回的 Deferred 对象可以通过 await() 方法来获取协程的执行结果。
// www.javascriptcn.com code example
val deferred = GlobalScope.async {
// 执行一些需要返回结果的操作
delay(1000)
"Task result"
}
// 通过 await() 方法获取协程的执行结果
val result = deferred.await()
println(result)异常处理
launch:如果在launch块中发生异常,协程会立即取消,并且异常会传播到父协程或协程作用域。async:如果在async块中发生异常,异常不会立即传播,只有在调用await()时才会抛出异常。
并发执行
async 通常用于并发执行多个任务,而 launch 则用于执行单个任务。例如,可以使用 async 来并发执行多个网络请求:
// www.javascriptcn.com code example
val deferred1 = GlobalScope.async {
// 网络请求 1
delay(1000)
"Result 1"
}
val deferred2 = GlobalScope.async {
// 网络请求 2
delay(1000)
"Result 2"
}
val result1 = deferred1.await()
val result2 = deferred2.await()
println("Results: $result1, $result2")总结
launch用于不需要返回结果的任务,返回Job对象。async用于需要返回结果的任务,返回Deferred对象,并通过await()获取结果。launch的异常会立即传播,而async的异常在调用await()时才会抛出。