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 ()
- ¿Qué es RxJava equivalente de orElse
- Manera correcta de manejar ninguna red con Retrofit y RX-java
- Android Rxjava suscribirse a un cambio de variable
- Obtenga el valor actual de RxJava Observable
- Utilizando RxJava para la validación de inicio de sesión de correo electrónico, un observable está emitiendo dos veces
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?
- Implementar reintento Cuando la lógica
- RxJava como autobús de eventos?
- ¿Cuál es la manera correcta de burlarse de un RxJava Observable
- Limitar el rendimiento con RxJava
- RxJava - cómo invocar abonado en eventos de 4 clics en Android
- Android + RxJava - carga de datos de db y servicio web
- RxJava No puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
- Retrofit no puede crear adaptador de llamada
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(); } });