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

如何使用RxJava串行执行多个Retrofit请求?

实现Retrofit请求的串行执行

你的问题核心是要把原来并行的请求改成串行依次执行,RxJava里有两种简单的方式可以实现,我给你详细说下:

方法一:用concatMap替代flatMap

concatMap是RxJava专门用来保证顺序执行的操作符,它会严格等待前一个Observable完成(无论是成功还是错误)之后,才会订阅并执行下一个请求,完美符合你的需求。

修改后的代码如下:

idsList
    .subscribeOn(scheduler.computation())
    .observeOn(scheduler.ui())
    .flatMapIterable { ids -> ids }
    // 把flatMap换成concatMap即可
    .concatMap { id -> requestEmployeeData(id) }
    .subscribe(
        { success -> println("success") },
        { error -> error.printStackTrace() }
    )

方法二:给flatMap设置并发数为1

如果你不想替换操作符,也可以在原来的flatMap里指定maxConcurrency参数为1,强制限制同时只能有1个请求在执行,达到串行效果:

idsList
    .subscribeOn(scheduler.computation())
    .observeOn(scheduler.ui())
    .flatMapIterable { ids -> ids }
    // 设置maxConcurrency=1,限制并发数为1
    .flatMap({ id -> requestEmployeeData(id) }, maxConcurrency = 1)
    .subscribe(
        { success -> println("success") },
        { error -> error.printStackTrace() }
    )

为什么原来的代码会并行?

原来的flatMap默认没有并发数限制(或者说默认并发数很高),它会一次性订阅所有由requestEmployeeData(id)生成的Observable,所以所有请求会同时发起,这就是你看到的并行现象。

两种方法都能实现串行,个人更推荐第一种concatMap,因为它的语义更明确,一看就知道是要保证顺序执行的逻辑。

内容的提问来源于stack exchange,提问作者Tarcisio Wensing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:22:22