我在android中使用RxJava和RxBindings进行查看。以下是我正在做的事情的一个例子。
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");
});
当我点击MyButton时,我使用flatMap返回另一个observable,它是一个网络调用,可以返回成功或错误。当它返回错误时我在错误块中处理它。但我无法再次点击该按钮。
如何处理错误并仍然可以再次点击按钮?
答案 0 :(得分:7)
GreyBeardedGeek就是现货。要明确您的某个选项,您可以使用.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");
});
顺便说一下,不要将null传递给Observable.error()
。
答案 1 :(得分:4)
我对RxJava很陌生,但我自己也遇到了这个问题。
问题在于,根据定义,当Observable调用error()方法时,它将停止发出值。
据我所知,您有两种选择:
修改进行网络调用的Observable,以便在发生错误时不抛出异常,而是返回一个指示发生错误的值。这样,当发生网络错误时,不会调用Observable的error()方法。
调用error()时,使用Observable.onErrorResumeNext覆盖Observable的终止。看到 Best practice for handling onError and continuing processing
答案 2 :(得分:2)
我使用类似已经描述的方法:
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
});
我有一个short article来描述这种方法。