RxJava/RxBinding:如何处理RxView上的错误

g.r*_*ion 7 java android reactive-programming rx-java rx-android

我在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");
    });
Run Code Online (Sandbox Code Playgroud)

当我点击MyButton时,我使用flatMap返回另一个observable,它是一个网络调用,可以返回成功或错误.当它返回错误时我在错误块中处理它.但我无法再次点击该按钮.

如何处理错误并仍然可以再次单击按钮?

Dav*_*ten 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");
    });
Run Code Online (Sandbox Code Playgroud)

顺便说一句,不要将null传递给Observable.error().


Gre*_*eek 4

我对 RxJava 很陌生,但我自己也遇到过这个问题。

问题在于,根据定义,Observable 在调用它的 error() 方法时将停止发出值。

据我所知,你有两种选择:

  1. 修改进行网络调用的 Observable,以便在发生错误时不会引发异常,而是返回一个指示发生错误的值。这样,当发生网络错误时,将不会调用 Observable 的 error() 方法。

  2. 考虑使用 Observable.onErrorResumeNext 来覆盖调用 error() 时 Observable 的终止。请参阅 处理 onError 和继续处理的最佳实践