You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:15:19