Flatten Observable <Observable <Cursor >> Observable <Cursor>

Tengo un Observable que devuelve una única instancia de Cursor ( Observable<Cursor> ). Estoy intentando utilizar ContentObservable.fromCursor para obtener la fila de cada cursor en la onNext llamada onNext .

Una de las soluciones que he descubierto es tal construcción:

 ContentObservable.fromCursor(cursorObservable.toBlocking().first()) .subscribe(cursor -> { // map to object // add to outer collection }, e -> {}, () -> { // do something with list of objects (outer collection) }); 

Esto se parece bastante a un hack debido a toBlocking().first() , pero funciona. No me gusta porque la mayor parte del procesamiento se realiza en onNext callback y tenemos que crear una colección externa para mantener los resultados intermedios.

Quería usarlo así:

 cursorObservable.map(ContentObservable::fromCursor) .map(fromCursor -> fromCursor.toBlocking().first()) .map(/* map to object */) .toList() .subscribe(objects -> { // do something with list of objects } 

Esto todavía utiliza toBlocking().first() y no funciona porque una vez que el observador fromCursor ha terminado el cursor está cerrado por lo que no hay manera de asignar a objeto. ¿Hay una mejor manera de aplastar Observable<Observable<Cursor>> a Observable<Cursor> ?

¿Hay una mejor manera de aplastar Observable<Observable<Cursor>> a Observable<Cursor> ?

Sí, puede utilizar el método Observable.concat :

 public static void main(String[] args) { final Observable<String> observable = Observable.just("1", "2"); final Observable<Observable<String>> nested = observable.map(value -> Observable.just(value + "1", value + "2")); final Observable<String> flattened = Observable.concat(nested); flattened.subscribe(System.out::println); } 

ACTUALIZAR

En realidad, existen otros métodos para transformar un Observable<Observable<Cursor>> en Observable<Cursor> :

  • Observable.concat
  • Margen observable
  • Observable.switchOnNext

Sólo elija uno que sea más apropiado para usted.

ACTUALIZAR 2

Otra solución es modificar un poco tu código y utilizar un operador flatMap lugar de un map :

 cursorObservable.flatMap(ContentObservable::fromCursor) .map(/* map to object */) .toList() .subscribe(objects -> { // do something with list of objects (outer collection) } 
  • RxJava Android: cargar datos de caché en los subprocesos adecuados
  • NetworkOnMainThreadException con retrofit-beta2 y rxjava
  • Cómo utilizar rxandroid para escuchar la actualización de ubicación de gps
  • Escritura de pruebas síncronas para Rx v2 Flowable
  • Combinación de escuchas de datos en tiempo real Firebase con RxJava
  • Cómo amortiguar solamente la última emisión de rx.Observable durante contrapresión
  • Rxjava Android cómo utilizar el operador Zip
  • ¿Cómo devolver el valor con RxJava?
  • RxJava, ejecuta código en el hilo del observador antes de encadenar dos observables
  • ¿Cómo ignorar el error y continuar la corriente infinita?
  • Encadenamiento de RxJava observables con callbacks / listeners
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.