RxJava dividir uno Observable a dos subObservables

Soy totalmente nuevo a RxJava y lo he pasado todo el día entendiéndolo, estoy atando para pensar cómo solucionar este problema:

Tengo un objeto, buscado por Retrofit , contiene dos ArrayLists , tengo que procesar cada ArrayList diferentemente. Actualmente se ve como:

 apiService.getUser(token).enqueue(new Callback<User>() { @Override public void onResponse(Response<User> response) { final User user = response.body(); for (Skill s : user.getSkills()) { // process here first ArrayList } for (OrganizerAction o : user.getOrganizerActions()) { // process here second ArrayList } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }); 

ACTUALIZAR:

 public class User { // fields @SerializedName("organizer_actions") @Expose private List<OrganizerAction> mOrganizerActions; @SerializedName("skills") @Expose private List<Skill> mSkills; public List<OrganizerAction> getOrganizerActions() { return mOrganizerActions; } public List<Skill> getSkills() { return mSkills; } } 

Gracias,
Anton

Esta respuesta es para Retrofit 2.0.0-beta, que es lo que parece estar utilizando. Además, no dio sus POJO o definiciones de servicio, por lo que va a utilizar un ejemplo general de la API de GitHub como guía, modificar para que coincida con los datos especificados.

El primer paso es convertir la definición de servicio a utilizar Observable lugar de Call .

 public interface GitHubService { @GET("/users/{user}") Observable<User> getUser(@Path("user") String user); } 

Dónde está el User

 public class User { public String login; public int id; } 

A continuación, agregue un adaptador de llamada personalizado a su constructor de adaptación con addCallAdapterFactory

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); 

Obtenga su servicio de la manera habitual –

 GitHubService gitHubService = retrofit.create(GitHubService.class); 

A continuación, obtenga su cache observable y de llamada en él para crear un Observable que reproducirá el resultado. A partir de ese Observable, puede suscribirse varias veces, en su caso, puede suscribirse dos veces. Una vez para cada tipo de datos que le interesan y utilice la función de map para transformar desde el objeto User a sus campos específicos. map permite aplicar la función a los datos en el observable. Vea los documentos para más detalles. En este ejemplo, haremos dos flujos. Uno para los campos id y login .

 Observable<User> getUserResult = gitHubService.getUser("octocat").cache(1); getUserResult.map(new Func1<User, Integer>() { @Override public Integer call(User user) { return user.id; } }).subscribe(new Action1<Integer>() { @Override public void call(Integer id) { Log.d("Stream 1", "id = " + id); } }); getUserResult.map(new Func1<User, String>() { @Override public String call(User user) { return user.login; } }).subscribe(new Action1<String>() { @Override public void call(String login) { Log.d("Stream 2", "login = " + login); } }); 

Por último, asegúrese de que su archivo gradle tiene las dependencias necesarias,

 compile 'io.reactivex:rxjava:1.0.14' compile 'com.squareup.retrofit:retrofit:2.0.0-beta1' compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1' 

Y, no está directamente relacionado con su pregunta, pero si va a hacer RxJava en Android, le recomiendo check – out Retrolambda si no lo ha hecho ya. El mapa anterior y el código de suscripción, y el código Rx en general, es más sucinto con lambdas.

 getUserResult.map(user -> user.id).subscribe( id -> { Log.d("Stream 1", "id = " + id); } ); getUserResult.map(user -> user.login).subscribe( login -> { Log.d("Stream 2", "login = " + login); } ); 
  • IdlingResource Espresso con RxJava
  • RxJava Break Chain en Condicional
  • Retrofit 2 + Rxjava error de manipulación
  • Observable.empty () hace que java.util.NoSuchElementException: Secuencia no contiene elementos
  • Android rxjava ordenar la lista con la clase de comparación
  • RxJava se vuelve a suscribir al evento tras la restauración de la actividad
  • Prueba de desplazamiento sin fin RecyclerView con Espresso y RxJava
  • .debounce () de RxJava interfiriendo con los hilos de mis observables y manejo de errores
  • Flatten Observable <Observable <Cursor >> Observable <Cursor>
  • RxJava reintentoCuando vuelve a suscribir la propagación
  • Cuándo cancelar una suscripción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.