Encadenamiento de dos llamadas de servicio web mediante RxJava y Retrofit

Estoy utilizando RxJava y Retrofit.My requisito básico es, quiero encadenar dos api llamadas, que se llaman uno tras otro. La respuesta recibida desde el primer api se utiliza como entrada mientras se llama al segundo api. Después de leer algunas cosas en internet yo solía planear para lograr esto. Mientras que realiza esta operación estoy demostrando el cargador. A veces funciona suavemente pero en algunas ocasiones este cargador congela. DDMS muestra el registro de "saltó 300 marcos, la aplicación puede estar haciendo demasiado trabajo en su hilo principal". Sospecho que una de mis llamadas de red se está ejecutando en el hilo principal. No soy capaz de averiguar cómo encadenar estas dos llamadas para que puedan ser llamadas suavemente en el fondo sin obstaculizar mi hilo principal. Cualquier ayuda es muy apreciada . Gracias de antemano Esto es lo que he intentado hasta ahora

private CompositeSubscription mSubscriptions = new CompositeSubscription(); Subscription subscription = Observable.just(getAddress()) .subscribeOn(Schedulers.newThread()) .flatMap(address -> mPlatformApi.secondWebService(address.getLatitude(),address.getLongitude()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(modelTwo -> { //updating My ui }, throwable -> { //Error Handling }); mSubscriptions.add(subscription); private android.location.Address getAddress(){ String addressString = "";//some Address String Geocoder coder = new Geocoder(getActivity()); android.location.Address address=null; try { ArrayList<android.location.Address> addressList = (ArrayList<android.location.Address>) coder.getFromLocationName(addressString, 1); if(addressList !=null && addressList.size()>0) { address = addressList.get(0); } else { } } catch (IOException e) { e.printStackTrace(); } return address; } //My Retrofit call Observable<modelTwo> secondWebService(@Path("lat") double lat,@Path("lon") double lon); 

Considera esto:

 final android.location.Address address = getAddress(); Subscription subscription = Observable.just(address) ... 

Esto es equivalente a su código, pero también debe dejar claro que getAddress() se evalúa antes de que RxJava esté involucrado y haya tenido la oportunidad de intervenir . En otras palabras, cuando se utiliza just , el subscribeOn sólo puede mover la emisión de la dirección (llamando onNext(address) en su Subscriber ) a otro hilo. Sin embargo, la creación de la Dirección – es decir, su getAddress – ya habrá pasado en el hilo principal cuando llegue a este punto.

La manera más fácil de mover realmente getAddress a otro hilo es usar defer :

 Subscription subscription = Observable.defer(new Func0<Observable<android.location.Address>>() { @Override public Observable<android.location.Address> call() { return Observable.just(getAddress()); } }) .subscribeOn(Schedulers.newThread()) .flatMap(address -> mPlatformApi.secondWebService(address.getLatitude(),address.getLongitude() ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(modelTwo -> { //updating My ui }, throwable -> { //Error Handling }); 

De esta manera, todo el Func0 se ejecutará en newThread() – no sólo el just sino también el getAddress .

  • Usando observeOn () el hilo de interfaz de usuario de Android bloquea mi prueba de emulador
  • Uso de RxJava dentro de RecyclerView Adapter
  • Observer.onError disparando de manera incoherente
  • Manejo de excepciones API en RxJava
  • Cancelar la suscripción de un rx.Single en RxJava
  • Retrofit 2 RxJava - Gson - Deserialización "Global", tipo respuesta de cambio
  • Android rxjava ordenar la lista con la clase de comparación
  • RxJava Observable a Completable, cómo evitar toBlocking ()
  • RxAndroid textview eventos llamados automáticamente antes de cambios de texto eventos
  • Cancelación de varias suscripciones a la vez en RxAndroid - Android
  • Prueba de Android Realm con RxJava - "abierto desde un hilo sin un Looper" Excepción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.