Observable OnCompleted no puede actualizar la interfaz de usuario

Estoy tratando de Toast terminar una llamada de servicio. Sin embargo, en el método onComplete recibo esta excepción:

java.lang.RuntimeException: No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()

Se tira de SafeSubscriber#onNext(T args) que se ve así:

 /** * Provides the Subscriber with a new item to observe. * <p> * The {@code Observable} may call this method 0 or more times. * <p> * The {@code Observable} will not call this method again after it calls either {@link #onCompleted} or * {@link #onError}. * * @param args * the item emitted by the Observable */ @Override public void onNext(T args) { try { if (!done) { actual.onNext(args); } } catch (Throwable e) { // we handle here instead of another method so we don't add stacks to the frame // which can prevent it from being able to handle StackOverflow Exceptions.throwIfFatal(e); // handle errors if the onNext implementation fails, not just if the Observable fails onError(e); } } 

Este es el fragmento de código de mi código donde surge el problema:

  NetworkService.aService() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatmap(anotherCall) .subscribe(new Subscriber<AddCommentResponse>() { @Override public void onCompleted() { Toast.makeText(...).show(); navigateBack(); } // etc. ... 

¿Es el problema que no puedo actualizar la interfaz de usuario del método onCompleted? ¿O dónde debo manejar las operaciones de la interfaz de usuario?

Tal vez el anotherCall observar en otro hilo. Mueva el observeOn (en el hilo principal de android) después de la llamada de flatMap .

Originalmente:

 NetworkService.aService() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatmap(anotherCall) 

Después de este cambio está funcionando:

 NetworkService.aService() .flatmap(anotherCall) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 

NetworkService está en el subproceso de trabajo. Usted está llamando a makeText (..) del hilo de trabajo, que debe llamarse desde un subproceso de UI. Trate de crear un manipulador y tostar desde dentro.

 ActivityContext.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show(); } }); 
  • RxJava: "java.lang.IllegalStateException: Sólo un suscriptor permitido!"
  • Uso de Mockito con Retrofit 2.0
  • Habilitación del botón cuando EditText tiene texto (RxAndroid)
  • Cómo encadenar los métodos groupBy () de RxJava como groupBy (). GroupBy ()
  • ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
  • Cómo hacer que flatMap se ejecute en un subproceso de fondo
  • Cómo anular los Observables compartidos, infinitos con un retraso después de que el último suscriptor no se haya suscrito
  • ¿Cómo utilizar Rx para gestionar múltiples observadores con el fin de mantener una sola conexión abierta a un servicio?
  • RxAndroidBle mantener una conexión persistente + Manejo de escritura / notificación
  • RxJava y Sqlbrite - qué operador utilizar
  • Introducción a RxJava con sqlite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.