面试题答案
一键面试launch
- 特点:
- 启动一个新的协程并立即返回一个
Job
对象,它表示这个协程的句柄。 - 协程以异步非阻塞的方式执行,不会阻塞当前线程。
- 它并不返回任何结果,适合执行不需要返回值的异步任务,比如日志记录、后台数据更新等。
- 启动一个新的协程并立即返回一个
- 使用场景:
- 当你需要执行一些后台任务,并且不关心其执行结果时使用。例如,在应用中向服务器发送一些无返回值的状态更新请求,或者在后台清理缓存文件等操作。
async
- 特点:
- 同样启动一个新的协程并返回一个
Deferred
对象,Deferred
继承自Job
,它不仅可以控制协程的生命周期,还能获取协程的执行结果。 - 协程以异步非阻塞方式执行。
- 要获取
async
启动的协程结果,需要调用Deferred
对象的await()
方法,await()
方法会挂起当前协程,直到async
协程执行完成并返回结果。
- 同样启动一个新的协程并返回一个
- 使用场景:
- 当你需要异步执行一个任务并获取其返回结果时使用。比如从网络获取数据、进行数据库查询并需要处理查询结果等场景。例如,多个网络请求并发执行,最后将各个请求的结果汇总处理。
runBlocking
- 特点:
- 它会阻塞当前线程,直到其内部的协程执行完毕。
- 通常用于在主线程中启动和等待协程的完成,例如在
main
函数中或者测试代码中使用。 - 可以作为协程世界和非协程世界的桥梁,因为它可以在非协程环境(如普通的Java或Kotlin函数)中启动协程并等待其完成。
- 使用场景:
- 在
main
函数中启动协程来执行一些异步任务,由于main
函数所在线程需要等待协程执行完毕才能正常退出,所以runBlocking
可以满足这个需求。在测试代码中,也经常使用runBlocking
来启动协程并等待其执行结果以便进行断言等操作。
- 在