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 ()
- Observer.onError disparando de manera incoherente
- ¿Cómo puedo implementar el equivalente RxJava de INotifyPropertyChanged para hacer un modelo de datos Observable?
- Excepción de interrupción de subproceso en modo Multi-ventana
- Cómo manejar la rotación con Retrofit y RxJava / RxAndroid en Actividad?
- Android: Realm.getInstance (context) devuelve una instancia de dominio ya cerrada
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?
- Progreso de descarga con RxJava, OkHttp y Okio en Android
- RxJavaCallAdapterFactory no se puede convertir en Factory
- Inter fragmento de comunicación utilizando rxjava
- ¿Asignación de objetos cuando se usa RxJava en código de 'alto tráfico'?
- RxJava y eventos esporádicos al azar en Android
- RxJava y Retrofit2: NetworkOnMainThreadException
- Comprensión de flujos de datos y múltiples suscriptores (con retroadaptación)
- CalledFromWrongThreadException incluso cuando se utiliza AndroidSchedulers.mainThread ()
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(); } });