Как выполнить 2 запроса последовательно в Android RxJava Observable?

Я хочу запустить 2 асинхронные задачи, за которыми следуют другие (последовательно). Я кое-что прочитал об ZIP или Flat, но я не очень хорошо это понял …

Моя цель – загрузить данные из локального SQLite, и когда он завершится, он вызывает запрос на сервер (удаленный).

Может кто-то подсказывает мне, способ добиться этого?

Это скелет RxJava Observable, который я использую (одна задача):

// RxJava Observable Observable.OnSubscribe<Object> onSubscribe = subscriber -> { try { // Do the query or long task... subscriber.onNext(object); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } }; // RxJava Observer Subscriber<Object> subscriber = new Subscriber<Object>() { @Override public void onCompleted() { // Handle the completion } @Override public void onError(Throwable e) { // Handle the error } @Override public void onNext(Object result) { // Handle the result } }; Observable.create(onSubscribe) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); 

Оператор для этого будет merge , см. http://reactivex.io/documentation/operators/merge.html .

Мой подход состоял бы в создании двух наблюдаемых, скажем, observableLocal и observableRemote , и объединить вывод:

 Observable<Object> observableLocal = Observable.create(...) Observable<Object> observableRemote = Observable.create(...) Observable.merge(observableLocal, observableRemote) .subscribe(subscriber) 

Если вы хотите, чтобы удаленный запуск выполнялся после локального, вы можете использовать concat .

Ответ Лукаса Батто лучше всего, если запросы не зависят друг от друга. Однако, если вам необходимо получить данные из локального запроса SQLite перед запуском удаленного запроса (например, вам нужны данные для параметров или заголовков удаленного запроса), тогда вы можете начать с локального наблюдаемого, а затем с помощью плоской карты Объедините два наблюдаемых после получения данных из локального запроса:

  Observable<Object> localObservable = Observable.create(...) localObservable.flatMap(object -> { return Observable.zip(Observable.just(object), *create remote observable here*, (localObservable, remoteObservable) -> { *combining function* }); }).subscribe(subscriber); 

Функция flatmap позволяет преобразовать локальные наблюдаемые в комбинацию локальных и удаленных наблюдаемых через zip-функцию. И повторить, преимущество состоит в том, что два наблюдаемых являются последовательными, и функция zip будет работать только после запуска обоих зависимых наблюдаемых.

Кроме того, функция zip позволит вам комбинировать наблюдаемые объекты, даже если базовые объекты имеют разные типы. В этом случае вы предоставляете функцию объединения в качестве третьего параметра. Если базовые данные одного типа, замените zip-функцию на слияние.