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:
- ¿Dónde se puede encontrar AndroidObservable.fromBroadcast ahora?
- Hacer cola de tareas con RxJava en Android
- Cómo anular los Observables compartidos, infinitos con un retraso después de que el último suscriptor no se haya suscrito
- Comprobación de Internet, dónde colocar al usar MVP, RX y Retrofit
- RxJava / Retrofit - ¿Cómo puedo obligar a los usuarios a usar una subclase específica de suscriptor?
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>
?
- ¿Por qué debounce () con toList () no funciona en RxAndroid?
- RxAndroid: cambios de interfaz de usuario en el subproceso Schedulers.io ()
- Obtenga el valor actual de RxJava Observable
- Dar un RxJava Observable algo a emitir de otro método
- Observable vs Flujo rxJava2
- RxJava Async tarea en Android
- ¿Cómo recuperar cuerpo de respuesta con RxAndroid y Retrofit 2?
- Android rxjava ordenar la lista con la clase de comparación
¿Hay una mejor manera de aplastar
Observable<Observable<Cursor>>
aObservable<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) }