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.
- Disminuir los clics de botón mediante Rx
- Utilizando RxJava para buscar objetos, transforma una lista contenedora y usa la lista
- RxJava y MVP en la aplicación para Android
- Robolectric Test no llama a textWatcher.onTextChanged
- Retrofit no desencadena onError cuando se utiliza ErrorHandler personalizado
¿Cómo puedo manejar el error y seguir siendo capaz de hacer clic en el botón de nuevo?
- RxAndroid y Retrofit: No se puede crear el adaptador de llamada para io.reactivex.Observable <retrofit2.Response <okhttp3.ResponseBody >>
- RxJava No puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
- Prueba Espresso con RxLoader
- Suscribir un cajón de navegación a un Observable
- Uso de subscribeOn con Retrofit
- Netflix vs ReactiveX RxJava-Biblioteca de Android
- ¿Cuál es la forma correcta de manejar suscripciones en RxJava / RxAndroid para un ciclo de vida de actividad?
- ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
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:
-
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.
-
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.
- Cómo saber cuántas preferencias compartidas en las preferencias compartidas en android
- Cómo contar android gcm carga útil