RxJava + retrofit, obtenga una lista y agregue información adicional para cada artículo

Estoy jugando con RXJava, retrofit en Android. Estoy tratando de lograr lo siguiente:

Necesito hacer una encuesta periódicamente una llamada que me da un Observable> (Desde aquí podría hacerlo)

Una vez que consiga esta lista quiero iterar en cada entrega y llamar a otros métodos que me dará la ETA (tan sólo más información) Quiero adjuntar esta nueva información en la entrega y devolver la lista completa con la información adicional adjunta a Cada artículo.

Sé cómo hacer eso sin rxjava una vez que consiga la lista, pero me gustaría practicar.

Este es mi código hasta ahora:

pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)) .map(tick -> RestClient.getInstance().getApiService().getDeliveries()) .doOnError(err -> Log.e("MPB", "Error retrieving messages" + err)) .retry() .subscribe(deliveries -> { MainApp.getEventBus().postSticky(deliveries); }); 

Esto me da una lista de entregas. Ahora me gustaría lograr la segunda parte.

Espero haber sido lo suficientemente claro. Gracias

Finalmente encontré una buena manera de hacerlo.

 private void startPolling() { pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)) .flatMap(tick -> getDeliveriesObs()) .doOnError(err -> Log.e("MPB", "Error retrieving messages" + err)) .retry() .subscribe(this::parseDeliveries, Throwable::printStackTrace); } private Observable<List<Delivery>> getDeliveriesObs() { return RestClient.getInstance().getApiService().getDeliveries() .flatMap(Observable::from) .flatMap(this::getETAForDelivery) .toSortedList((d1, d2) -> { if (d1.getEta() == null) { return -1; } if (d2.getEta() == null) { return 1; } return d1.getEta().getDuration().getValue() > d2.getEta().getDuration().getValue() ? 1 : -1; }); } 

Vamos paso a paso.

  1. Primero creamos un Observable que dispara cada tiempo POLLING_INTERVAL el método getDeliveriesObs () que devolverá la lista final
  2. Utilizamos retrofit para obtener un Observable de la llamada
  3. Utilizamos flatMap para aplastar la lista de replanteo y obtener en el plano plano siguiente un elemento de entrega, uno por uno.
  4. A continuación, obtenemos el tiempo estimado de llegada establecido dentro del objeto Entrega y devolverlo
  5. Ordenamos la lista según la hora estimada de llegada.
  6. En caso de error se imprime y vuelve a intentarlo para que el intervalo no se detenga
  7. Subscribimos finalmente para conseguir la lista ordenada y con ETA dentro, después apenas la devolvemos o lo que usted necesita hacer con ella.

Está funcionando correctamente y es bastante agradable, estoy empezando a gustar rxjava 🙂

No he pasado mucho tiempo con Java 8 lambdas, pero aquí hay un ejemplo de asignación de cada objeto a un objeto diferente, y luego obtener una List<...> en el otro extremo en Java llano 7:

 List<Delivery> deliveries = ...; Observable.from(deliveries).flatMap(new Func1<Delivery, Observable<ETA>>() { @Override public Observable<ETA> call(Delivery delivery) { // Convert delivery to ETA... return someEta; } }) .toList().subscribe(new Action1<List<ETA>>() { @Override public void call(List<ETA> etas) { } }); 

Por supuesto, sería bueno tomar la respuesta Retrofit (presumiblemente un Observable<List<Delivery>> ?) Y sólo observar cada uno de ellos. Para eso, idealmente utilizar algo como flatten() , que no parece estar llegando a RxJava en cualquier momento pronto .

Para hacer eso, puede hacer algo como esto (mucho más agradable con lambdas). Usted reemplazaría Observable.from(deliveries) en el ejemplo anterior con lo siguiente:

 apiService.getDeliveries().flatMap(new Func1<List<Delivery>, Observable<Delivery>>() { @Override public Observable<Delivery> call(List<Delivery> deliveries) { return Observable.from(deliveries); } }).flatMap(...) 
  • RxJava2 en la función de devolución de llamada onLoadFinished de CursorLoader
  • RXJava - Dividir y combinar un Observable
  • ¿Cómo recuperar cuerpo de respuesta con RxAndroid y Retrofit 2?
  • En RxJava, cómo reintentar / reanudar en caso de error, en lugar de completar el observable
  • ¿Cuál es la forma correcta de manejar suscripciones en RxJava / RxAndroid para un ciclo de vida de actividad?
  • Cómo poner en cola las llamadas de la API cuando no está conectado mientras usa Retrofit
  • RxJava - subir archivos secuencialmente - emitir el siguiente elemento, cuando onNext llamado
  • Por qué definir Flowable podría recibir actualizaciones de la base de datos
  • RxJava dividir uno Observable a dos subObservables
  • Cómo cancelar la solicitud con retofit2 y RxAndroid
  • Compartiendo RxBindings Eventos observables entre múltiples suscriptores
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.