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

Android新手:Retrofit能否在单次网络请求中调用三个REST API?

嗨,作为Android开发新手,你问的这个问题非常常见——完全可以用Retrofit在单次逻辑请求中完成多个API接口的并行调用,下面我给你两种主流的实现方案,都是日常项目里高频使用的:

方案1:使用RxJava + Retrofit实现并行请求

RxJava的zip操作符可以帮你把多个Observable(Retrofit的Call可以转换成Observable)的结果合并在一起,等所有请求都完成后再统一处理结果。

步骤1:添加必要依赖

在你的build.gradle(Module级别)里添加以下依赖:

// Retrofit核心库
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
// RxJava适配Retrofit
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
// RxJava3核心库
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'

步骤2:定义Retrofit接口

把你的三个API接口定义成返回Observable的方法:

interface ApiService {
    @GET("api/first")
    fun getFirstData(): Observable<FirstResponse>

    @GET("api/second")
    fun getSecondData(): Observable<SecondResponse>

    @GET("api/third")
    fun getThirdData(): Observable<ThirdResponse>
}

步骤3:并行调用并合并结果

创建Retrofit实例后,用zip操作符合并三个请求:

val retrofit = Retrofit.Builder()
    .baseUrl("https://your-base-url.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
    .build()

val apiService = retrofit.create(ApiService::class.java)

// 合并三个Observable
Observable.zip(
    apiService.getFirstData(),
    apiService.getSecondData(),
    apiService.getThirdData(),
    { firstRes, secondRes, thirdRes ->
        // 这里可以把三个结果封装成一个数据类返回
        Triple(firstRes, secondRes, thirdRes)
    }
)
.subscribeOn(Schedulers.io()) // 在IO线程执行网络请求
.observeOn(AndroidSchedulers.mainThread()) // 回到主线程处理结果
.subscribe(
    { (first, second, third) ->
        // 处理三个接口返回的结果
        Log.d("RetrofitDemo", "First data: $first")
        Log.d("RetrofitDemo", "Second data: $second")
        Log.d("RetrofitDemo", "Third data: $third")
    },
    { error ->
        // 处理请求失败的情况
        Log.e("RetrofitDemo", "Request failed: ${error.message}")
    }
)
方案2:使用Kotlin协程 + Retrofit实现并行请求

如果你的项目已经用Kotlin开发,那协程的方案会更简洁,学习成本更低,我个人更推荐新手优先尝试这种方式。

步骤1:添加必要依赖

除了Retrofit核心依赖,还要添加协程相关的适配库:

// Retrofit核心库
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
// Retrofit协程适配
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
// Kotlin协程核心库
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

步骤2:定义Retrofit接口

接口方法用suspend修饰,符合协程的异步编程习惯:

interface ApiService {
    @GET("api/first")
    suspend fun getFirstData(): FirstResponse

    @GET("api/second")
    suspend fun getSecondData(): SecondResponse

    @GET("api/third")
    suspend fun getThirdData(): ThirdResponse
}

步骤3:并行调用并获取结果

在协程作用域内,用async启动三个并行的请求,然后等待所有请求完成:

val retrofit = Retrofit.Builder()
    .baseUrl("https://your-base-url.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val apiService = retrofit.create(ApiService::class.java)

// 在协程作用域中执行,比如ViewModel的viewModelScope,或者页面的LifecycleScope
viewModelScope.launch {
    try {
        // 启动三个并行请求
        val firstDeferred = async { apiService.getFirstData() }
        val secondDeferred = async { apiService.getSecondData() }
        val thirdDeferred = async { apiService.getThirdData() }

        // 等待所有请求完成,获取结果
        val firstRes = firstDeferred.await()
        val secondRes = secondDeferred.await()
        val thirdRes = thirdDeferred.await()

        // 处理结果
        Log.d("RetrofitDemo", "First data: $firstRes")
        Log.d("RetrofitDemo", "Second data: $secondRes")
        Log.d("RetrofitDemo", "Third data: $thirdRes")
    } catch (e: Exception) {
        // 处理请求失败
        Log.e("RetrofitDemo", "Request failed: ${e.message}")
    }
}

关键注意点

  • 两种方案的请求都是并行执行的,总耗时是三个请求中最慢的那个的耗时,而非三个耗时相加。
  • 异常处理要重视:RxJava的zip会在任意一个请求失败时直接触发错误回调;协程里需要用try-catch包裹所有请求逻辑,避免未捕获异常导致崩溃。
  • 记得在页面销毁等合适时机取消请求:RxJava可以用Disposable的dispose()方法,协程可以调用CoroutineScope的cancel()方法,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Abdul Quddus Mozumder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:43:45