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

