How to use RxJava to wait the end of two lists of Retrofit requests

Viewed 1130

Let me describe my situation:

  • I want to register new records via an API.
  • I want to update some records via an API.
  • I need to be notified when all of these requests have finished, to start another task.

Specifically I have two ArrayList:

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

Each report can use methods to get Observable instances from my ApiService (Retrofit implementation).

        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();
                }
            });

I am using the flatMap operator to get one Observable for each report.

But I am not sure how to wait until all of the requests have finished.

I was thinking in using the zip operator.

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

Unfortunately I saw some examples where zip is used to create pairs of Observables.

Please suggest me what operator I can use to achieve it. Or how to do it using rxJava with a different approach.

Thank you in advance.

2 Answers
Related