¿Cómo ejecutar 2 consultas secuencialmente en un Android RxJava Observable?

Quiero ejecutar 2 tareas asíncronas, una seguida por la otra (secuencialmente). He leído algo sobre ZIP o Flat, pero no lo entendí muy bien …

Mi propósito es cargar los datos de un SQLite local, y cuando termina, llama a la consulta al servidor (remoto).

¿Puede alguien sugerirme, una manera de lograr eso?

Este es el esqueleto RxJava Observable que estoy usando (tarea única):

// 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); 

    El operador para hacer eso sería la merge , véase http://reactivex.io/documentation/operators/merge.html .

    Mi enfoque sería crear dos observables, digamos observableLocal y observableRemote , y fusionar la salida:

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

    Si desea asegurarse de que el control remoto se ejecuta después de local, puede utilizar concat .

    La respuesta de Lukas Batteau es mejor si las consultas no dependen una de la otra. Sin embargo, si es necesario para obtener los datos de la consulta SQLite local antes de ejecutar la consulta remota (por ejemplo, necesita los datos para los params o encabezados de consulta remotos), puede comenzar con el local observable y luego planearlo para Combine los dos observables después de obtener los datos de la consulta local:

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

    La función de mapa plano le permite transformar el observable local en una combinación de los observables locales y remotos a través de la función zip. Y para reiterar, la ventaja aquí es que los dos observables son secuenciales, y la función zip sólo se ejecutará después de ejecutar ambos observables dependientes.

    Además, la función zip le permitirá combinar observables incluso si los objetos subyacentes tienen diferentes tipos. En ese caso, se proporciona una función de combinación como el 3er parámetro. Si los datos subyacentes son del mismo tipo, reemplace la función zip con una combinación.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.