在使用 Retrofit 和 RxJava 时,可以通过多种方式实现多次请求,比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式:
1. 串行请求(依赖关系)
一个请求的结果作为另一个请求的输入,可以用 flatMap 操作符。
示例:
apiService.requestA()
.flatMap(resultA -> apiService.requestB(resultA.getId())) // 使用 A 的结果发起 B 请求
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
resultB -> {
// 处理 B 请求的结果
},
throwable -> {
// 处理错误
}
);
2. 并行请求(无依赖关系)
多个请求同时进行,结果一起返回,可以用 zip 或 combineLatest。
示例:
Observable.zip(
apiService.requestA(),
apiService.requestB(),
(resultA, resultB) -> {
// 合并结果,返回需要的对象
return new CombinedResult(resultA, resultB);
}
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
combinedResult -> {
// 处理合并后的结果
},
throwable -> {
// 处理错误
}
);
3. 循环多次请求
如果需要根据一个列表或者循环多次发起请求,可以用 flatMapIterable 或 concatMap。
示例:
Observable.fromIterable(listOfIds) // 将列表转换为 Observable
.concatMap(id -> apiService.requestById(id)) // 依次发起请求
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> {
// 处理每次请求的结果
},
throwable -> {
// 处理错误
}
);
注意:
• 如果不关心顺序,可以用 flatMap 替代 concatMap,这样可以并发处理多个请求。
• concatMap 确保按顺序执行,但速度较慢。
4. 错误重试(Retry)
使用 retry 或 retryWhen 来处理失败后的重试逻辑。
示例:
apiService.requestA()
.retry(3) // 失败后重试 3 次
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> {
// 处理结果
},
throwable -> {
// 处理错误
}
);
5. 组合多种请求模式
可以结合 zip、flatMap 和 concatMap 实现复杂的请求逻辑。例如,先发起两个并行请求,再根据结果发起依赖请求。
示例:
Observable.zip(
apiService.requestA(),
apiService.requestB(),
(resultA, resultB) -> new CombinedResult(resultA, resultB)
)
.flatMap(combinedResult -> apiService.requestC(combinedResult.getId()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
resultC -> {
// 处理最终结果
},
throwable -> {
// 处理错误
}
);
总结
根据实际需求选择合适的模式:
• 串行请求:用 flatMap。
• 并行请求:用 zip 或 merge。
• 循环请求:用 concatMap 或 flatMapIterable。
• 错误重试:用 retry 或 retryWhen。
使用时需要注意线程切换(subscribeOn 和 observeOn),确保网络请求在 IO 线程,UI 操作在主线程。