RxJava / RxBinding: cómo manejar los errores en RxView

Estoy utilizando RxJava y RxBindings para ver en android. Siguiente es un ejemplo de lo que estoy haciendo.

RxView.clicks(btMyButton).flatMap(btn -> { // another observable which can throw onError. return Observable.error(null); }).subscribe(object -> { Log.d("CLICK", "button clicked"); }, error -> { Log.d("CLICK", "ERROR"); }); 

Cuando hago clic en MyButton, uso flatMap para devolver otro observable que es una llamada de red y puede devolver el éxito o error. Cuando devuelve un error i manejarlo en el bloque de error. Pero no puedo volver a hacer clic en el botón.

¿Cómo puedo manejar el error y seguir siendo capaz de hacer clic en el botón de nuevo?

GreyBeardedGeek es perfecto. Para ser bastante explícito sobre una de sus opciones puede utilizar .materialize() :

 RxView.clicks(btMyButton).flatMap(btn -> { if (ok) return someObservable.materialize(); else return Observable.error(new MyException()).materialize(); }).subscribe(notification -> { if (notification.hasValue()) Log.d("CLICK", "button clicked"); else if (notification.isOnError()) Log.d("CLICK", "ERROR"); }); 

Por cierto, no pase null a Observable.error() .

Soy bastante nuevo para RxJava, pero sólo he corrido a través de este problema yo mismo.

El problema es que por definición, un Observable dejará de emitir valores cuando se envíe el método error ().

Por lo que puedo decir, usted tiene dos opciones:

  1. Modifique el Observable que hace la llamada de red de modo que cuando se produce un error, no se genera una excepción, sino que devuelve un valor que indica que se ha producido un error. De esta manera, no se llamará al método error () de Observable cuando se produce un error de red.

  2. Observe el uso de Observable.onErrorResumeNext para anular la terminación del Observable cuando se invoca error (). Vea las mejores prácticas para manejar onError y seguir procesando

Utilizo el acercamiento similar a descrito ya:

 RxView.clicks(btMyButton) .flatMap(btn -> { // another observable which can throw onError. return Observable.error(null) .doOnError(error -> { //handle error }) .onErrorResumeNext(Observable.empty());//prevent observable from terminating }) .subscribe(object -> { Log.d("CLICK", "button clicked");//here no errors should occur }); 

Tengo un breve artículo que describe este enfoque.

  • RxAndroid, bus de eventos y ciclo de vida de la actividad
  • Retrofit 2 + Rxjava error de manipulación
  • RxJava + Retrofit -> BaseObservable para llamadas API para manejo centralizado de respuesta
  • RxJava Async tarea en Android
  • Rx Java mergeDelayError no funciona como se esperaba
  • Android AsyncTask vs hilo + controlador vs rxjava
  • Creando Observable sin utilizar Observable.create
  • Cómo obtener un Desechable para sujetos como suscriptor en RxJava2
  • Obtenga el valor actual de RxJava Observable
  • Retrofit 2.0 + RxJava + Error JSON cuerpo
  • ¿Cómo estructurar mi aplicación usando MVP con rxjava y retrofit para obtener datos de Observables?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.