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

RxJava Observable链式调用问题:多步骤执行顺序异常求助

解决RxJava Observable调用链的顺序问题

你的问题核心在于步骤1的两个Completable是串行执行的,而不是你想要的并行执行——andThen()会在前一个Completable完成后才执行下一个,所以当前代码里Task_User_Login.run()完成后就立刻开始downloadListOfStreets(),但你需要这两个任务同时启动,等两者都完成后再进入步骤2。

接下来给你调整后的代码,完全匹配你想要的执行顺序:

// 步骤1:并行执行两个Completable,等两者都完成后进入步骤2
Completable step1 = Completable.mergeArray(
    Task_User_Login.run(AppConstants.defaultLoginParameters),
    downloadListOfStreets().doOnComplete(this::onStreetsDownloaded)
);

// 步骤2:并行执行两个Observable,合并结果
Observable<Object> step2 = Observable.merge(
    downloadListOfProducts(),
    downloadListOfIngredients()
);

// 组装完整调用链
step1
    .andThen(step2) // 步骤1完成后执行步骤2
    .andThen(logoutDummySession()) // 步骤2完成后执行步骤3
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnNext(item -> updateItemsDownloaded()) // 处理步骤2的每个结果项
    .doOnError(error -> downloadCompleted.postValue(Response.error(error)))
    .doOnComplete(() -> downloadCompleted.postValue(Response.success(null)))
    .subscribe();

关键调整说明:

  • 步骤1并行化:用Completable.mergeArray()替代andThen(),它会同时订阅所有传入的Completable,只有当所有Completable都完成时,整个step1才会完成,完美满足你步骤1并行的需求。
  • 步骤2与步骤3的顺序:用andThen()连接step1、step2、step3,确保严格的先后顺序——step1全部完成→step2并行执行→step2全部完成→step3执行。
  • 保留原有回调逻辑:你之前的doOnComplete(this::onStreetsDownloaded)、doOnNext等回调都保留了,不影响原有业务逻辑。

如果还有其他细节需要调整,比如步骤2的结果合并方式(比如用zip而不是merge来保证两个列表的配对关系),可以根据你的业务需求再修改,但当前代码已经完全匹配你描述的执行顺序要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:47:49