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
相关产品推荐
相关产品推荐

