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

时间:2015-08-19 00:52:50

标签: 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");
    });

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

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

3 个答案:

答案 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()方法时,它将停止发出值。

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

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

  2. 调用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来描述这种方法。