Android Kotlin中如何并行执行Coroutine API请求?
解决多API并行请求超时与执行不全问题
你的问题核心在于同时发起10个API请求时,受到OkHttp连接池默认并发限制或服务器端限流,导致部分请求排队超时,而非协程并行逻辑本身的问题。以下是针对性的解决方案:
1. 调整OkHttp连接池配置
OkHttp默认仅允许同一Host最多5个并发连接,10个请求同时发起会导致后续请求排队等待,最终超时。修改连接池参数,提升并发能力:
// 构建自定义OkHttp Client val okHttpClient = OkHttpClient.Builder() // 设置连接池:最大空闲连接数10,连接保持时间5分钟 .connectionPool(ConnectionPool(10, 5, TimeUnit.MINUTES)) // 调整超时时间(根据实际需求设置,建议30秒以上) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build() // Retrofit使用该Client val retrofit = Retrofit.Builder() .baseUrl("你的API域名") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build()
2. 协程并发量控制
即使提升了OkHttp连接数,一次性发起10个请求也可能触发服务器的限流策略。通过Semaphore控制同时执行的请求数量,避免过载:
class LoginViewModel : ViewModel() { private val apiService = retrofit.create(ApiService::class.java) // 限制同时最多5个并发请求,可根据服务器能力调整 private val apiCallSemaphore = Semaphore(5) // 封装API请求逻辑,统一处理并发控制与异常 private suspend fun executeApiCall(apiAction: suspend () -> Unit) { apiCallSemaphore.acquire() try { apiAction() } catch (e: Exception) { // 处理异常:超时、网络错误、服务器错误等 Log.e("LoginVM", "API请求失败: ${e.message}") } finally { apiCallSemaphore.release() } } private suspend fun fetchApi1() { val response = apiService.fetchApi1Data() if (response.isSuccessful) { // 处理响应:存入Room或更新UI状态 // withContext(Dispatchers.Main) { ... } } } // 同理实现fetchApi2()至fetchApi10()... fun fetchInitialApicalls() { viewModelScope.launch { // 批量启动并行请求 listOf( ::fetchApi1, ::fetchApi2, ::fetchApi3, ::fetchApi4, ::fetchApi5, ::fetchApi6, ::fetchApi7, ::fetchApi8, ::fetchApi9, ::fetchApi10 ).forEach { apiFunc -> launch(Dispatchers.IO) { executeApiCall { apiFunc.invoke() } } } } } }
3. 排查服务器端限制
如果调整客户端配置后仍有问题,需确认服务器是否对同一IP的并发请求数做了限制(比如部分后端框架默认限制并发数为5-8)。这种情况下需要和后端团队沟通,调整限流规则,或者进一步降低客户端的并发量。
4. 独立请求的异常隔离
每个API请求的协程是独立的,但务必在每个请求中添加异常捕获,避免单个请求的崩溃影响其他请求的执行(虽然launch启动的协程默认不会互相影响,但未捕获的异常会打印错误日志,影响排查)。
内容的提问来源于stack exchange,提问作者Vijan Kaush
相关产品推荐
相关产品推荐

