我使用RxJava Observables和lambda表达式进行Retrofit。我是RxJava的新手,无法了解如何执行以下操作:
public void saveSession() {
...
}
public void resetAll(View view) {
...
saveSession(); // I remove the view here.
}
我查看了error handling operators,但我不明白他们如何帮助我使用我的用例。
答案 0 :(得分:1)
方法1:保留两个Subscriber
但cache
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
并处理其他两种类型。