如何使用Kotlin协程实现多个独立Webservice接口并行调用
解决方案
错误写法原因分析
你尝试的三种写法问题分别如下:
- 第一种:
launch是协程作用域的扩展方法,普通函数没有协程上下文,无法直接调用,因此编译失败。 - 第二种:挂起函数本身不携带协程作用域,无法在内部直接调用
launch,同样会编译不通过。 - 第三种:直接依次调用带
withContext的挂起函数本质是串行执行,withContext会挂起当前协程直到内部逻辑执行完成,三个请求还是排队运行,没有达到并行的目的。
另外补充一个认知纠正:withContext并非只有需要返回值时才能使用,它的核心作用是切换到指定调度器执行代码,不需要返回值时返回Unit也完全可以正常使用。
正确实现
根据是否需要等待所有请求执行完成,分为两种常用场景:
场景1:需要等待所有请求执行完成后再退出makeWebserviceCalls函数
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking fun makeWebserviceCalls() = runBlocking { // 启动三个独立的子协程,并行执行 launch(Dispatchers.IO) { callOne() } launch(Dispatchers.IO) { callTwo() } launch(Dispatchers.IO) { callThree() } } fun callOne() { // 发起webservice调用 // 记录调用结果 } fun callTwo() { // 发起webservice调用 // 记录调用结果 } fun callThree() { // 发起webservice调用 // 记录调用结果 }
说明:runBlocking会阻塞当前线程,直到内部所有子协程执行完成再返回,三个launch启动的协程会同时在IO调度器上运行,互不干扰。如果需要单个请求异常不影响其他请求,可以给每个launch传入SupervisorJob()作为父任务。
场景2:不需要等待请求完成,调用后直接返回,请求在后台执行
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch // 自定义协程作用域,可根据业务需要管理生命周期,比如页面销毁时统一取消所有请求 private val requestScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) fun makeWebserviceCalls() { requestScope.launch { callOne() } requestScope.launch { callTwo() } requestScope.launch { callThree() } } fun callOne() { // 发起webservice调用 // 记录调用结果 } fun callTwo() { // 发起webservice调用 // 记录调用结果 } fun callThree() { // 发起webservice调用 // 记录调用结果 }
说明:自定义作用域使用SupervisorJob,单个请求执行失败不会取消其他请求,适合后台异步执行不需要等待结果的场景。
内容的提问来源于stack exchange,提问作者Mathew Alden
相关产品推荐
相关产品推荐

