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(); } }); 
  • ¿Existe una regla de proguard válida para RxJava y FasterXML?
  • RxJava alternativa para el operador map () para guardar los elementos emitidos
  • AbstractMethodError cuando se utiliza RxJavaCallAdapterFactory en Retrofit 2
  • Manejo de excepciones API en RxJava
  • ¿Es posible obtener 2 valores en onNext () de suscriptor en rxjava android?
  • MVP de Android con RxAndroid + Retrofit
  • RxJava solicitudes de red y almacenamiento en caché
  • Schedulers.immediate () no funciona con las pruebas de gradle de la línea de comandos
  • RxJava2 en la función de devolución de llamada onLoadFinished de CursorLoader
  • RxJava Observable a Completable, cómo evitar toBlocking ()
  • Manejar paginación con RxJava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.