RxJava:有条件地捕获错误并停止传播

时间:2016-02-25 04:32:24

标签: java error-handling rx-java observable retrofit2

我使用RxJava Observables和lambda表达式进行Retrofit。我是RxJava的新手,无法了解如何执行以下操作:

public void saveSession() {
...
}

public void resetAll(View view) {
...
saveSession(); // I remove the view here.
}

我查看了error handling operators,但我不明白他们如何帮助我使用我的用例。

1 个答案:

答案 0 :(得分:1)

方法1:保留两个Subscribercache Observable

保持现状,但将第一行更改为:

Observable<ResponseBody> res = api.getXyz().cache();

cache将确保请求仅发送一次,但{m}两个{s}}将获得所有相同的事件。

这样,您是否以及如何处理第一个Subscriber中的错误不会影响第二个Subscriber看到的内容。

方法2:使用Subscriber抓取一些错误,但转发所有其他错误。

onErrorResumeNext添加到onErrorResumeNext以生成类似的内容(在&#34;内部&#34;对象中):

Observable

只订阅一次(在&#34;外部&#34;对象中):

Observable observable = Observable.error(new IllegalStateException())
.onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
    @Override
    public Observable<?> call(Throwable throwable) {
        if (throwable instanceof NumberFormatException) {
            System.out.println("NFE - handled");
            return Observable.empty();
        } else {
            System.out.println("Some other exception - panic!");
            return Observable.error(throwable);
        }
    }
});

这样,只有在observable.subscribe(new Subscriber() { @Override public void onCompleted() { System.out.println("onCompleted"); } @Override public void onError(Throwable e) { System.out.println("onError"); e.printStackTrace(); } @Override public void onNext(Object o) { System.out.println(String.format("onNext: %s", String.valueOf(o))); } }); 无法处理错误时才会转发错误 - 如果可以,onErrorResumeNext只会调用Subscriber而不会其他任何内容。< / p>

onCompleted中有副作用让我有点不舒服。 : - )

编辑:哦,如果你想要更加严格,你可以使用方法3:在新对象中包装每个案例。

onErrorResumeNext

然后:

  • public abstract class ResultOrError<T> { } public final class Result<T> extends ResultOrError<T> { public final T result; public Result(T result) { this.result = result; } } public final class HandledError<T> extends ResultOrError<T> { public final Throwable throwable; public Result(Throwable throwable) { this.throwable = throwable; } } public final class UnhandledError<T> extends ResultOrError<T> { public final Throwable throwable; public Result(Throwable throwable) { this.throwable = throwable; } } (使用Result
  • 中包含正确的结果
  • map
  • 中换行可处理的错误
  • HandledError中的不可处理错误(使用带有UnhandledError子句的onErrorResumeNext
  • 处理if s(使用HandledError
  • doOnError - 它会收到所有三种类型的通知(Subscriber<ResultOrError<ResponseBody>>),但会忽略onNext并处理其他两种类型。