【问题标题】:How to use RxJava to wait the end of two lists of Retrofit requests如何使用 RxJava 等待两个 Retrofit 请求列表的结束
【发布时间】:2017-05-20 17:15:17
【问题描述】:

首先,让我描述一下我的情况:

  • 我想通过 API 注册新记录。
  • 我想通过 API 更新一些行。
  • 我需要在所有这些请求结束时收到通知,以便开始另一个任务。

具体来说我有两个ArrayList:

ArrayList<Report> createdReports = myHelper.getOfflineCreatedReports();
ArrayList<Report> editedReports = myHelper.getOfflineEditedReports();

每个报告都可以使用方法从我的 ApiService(与我的 Retrofit 实现相关联)获取 Observable 实例。

        Observable<NewReportResponse> createdReportsObs = Observable.from(createdReports) // .just() != .from()
            .flatMap(new Func1<Report, Observable<NewReportResponse>>() {
                @Override
                public Observable<NewReportResponse> call(Report report) {
                    return report.postToServer();
                }
            });

    Observable<NewReportResponse> editedReportsObs = Observable.from(editedReports)
            .flatMap(new Func1<Report, Observable<NewReportResponse>>() {
                @Override
                public Observable<NewReportResponse> call(Report report) {
                    return report.updateInServer();
                }
            });

我正在使用flatMap 运算符为每个报告获取一个 Observable。

但我不确定如何等到所有请求都完成。

我正在考虑使用zip 运算符。

Observable.zip(createdReportsObs, editedReportsObs, new Func2<NewReportResponse, NewReportResponse, Boolean>() {
        @Override
        public Boolean call(NewReportResponse justOneResponse, NewReportResponse justOneResponse2) {
            return false;
        }
    });

不幸的是,我看到了一些使用 zip 来创建 Observable 对的示例。

请告诉我可以使用什么运算符来实现它。或者如何以不同的方式使用 rxJava。

提前谢谢你。

【问题讨论】:

    标签: android rx-java retrofit2


    【解决方案1】:

    您使用的是 RxJava 2 吗?如果是这样,您可以使用新的可完成 api。这是假设您不需要知道任何服务器结果,只需要等待它们完成即可。

    Completeable.merge(createdReportsObs.toCompleteable(),
                       editedReportsObs.toCompleteable())
                .subscribe()
    

    【讨论】:

      【解决方案2】:

      这是我的方式。可能不是最佳做法。

      Observable.merge(createdReportsObs, editedReportsObs)
                .toList()
                .flatMap(Observable::from)
                .xxx //Now they are completed, do what you want
                .subscribe();
      

      【讨论】:

      • 谢谢。在merge 之后直接使用subscribe 有什么区别?
      • 您可以做的不仅仅是doOnCompleteddoOnError。完成此操作后,即使doOnNext在完成后也会被调用。
      猜你喜欢
      • 2018-05-16
      • 2017-06-06
      • 2018-12-28
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2018-06-12
      相关资源
      最近更新 更多