OnErrorReturn
OnErrorReturn操作符是当遇到异常发生时,让Observable发射一个事先预定好的数据出去。
原理图如下:
OnErrorReturn操作符使用如下:
@Override
protected void createObservable() {
super.createObservable();
mObservable = createErrorObservable(false).onErrorReturn(new Func1() {
@Override
public Object call(Object o) {
displayLogcat("onErrorReturn Object = " + o);
return "onErrorReturn throwable";
}
});
}
private Observable createErrorObservable(final boolean isException) {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
if (isException) {
subscriber.onError(new Exception("exception error return"));
} else {
subscriber.onError(new Throwable("throwable error return"));
}
} else {
subscriber.onNext(i);
}
}
}
});
}
运行代码,结果如下:
OnErrorResumeNext
OnErrorResumeNext操作符是当遇到异常发生时,发射下一个Observable
里的数据。
里的数据。
原理图如下:
OnErrorResumeNext操作符使用如下:
@Override
protected void createObservable() {
super.createObservable();
mObservable = createErrorObservable(false).onErrorResumeNext(Observable.just(5, 6, 7));
}
private Observable createErrorObservable(final boolean isException) {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
if (isException) {
subscriber.onError(new Exception("exception error resume next"));
} else {
subscriber.onError(new Throwable("throwable error resume next"));
}
} else {
subscriber.onNext(i);
}
}
}
});
}
运行代码,结果如下:
OnExceptionResumeNext
OnExceptionResumeNext操作符跟onErrorResumeNext操作符类型,只是OnExceptionResumeNext操作符区分了抛出异常的类型,如果是以exception抛出的,则表现形式跟onErrorResumeNext操作符一致,如果是以throwable抛出的,则会将这个错误发射出去。
原理图如下:
OnExceptionResumeNext操作符使用如下:
@Override
protected void createObservable() {
super.createObservable();
mObservable = createErrorObservable(false).onExceptionResumeNext(Observable.just(5, 6, 7));
}
private Observable createErrorObservable(final boolean isException) {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
if (isException) {
subscriber.onError(new Exception("exception on exception resume next"));
} else {
subscriber.onError(new Throwable("throwable on exception resume next"));
}
} else {
subscriber.onNext(i);
}
}
}
});
}
运行代码,结果如下:
Retry
OnExceptionResumeNext操作符跟onErrorResumeNext操作符类型,只是OnExceptionResumeNext操作符区分了抛出异常的类型,如果是以exception抛出的,则表现形式跟onErrorResumeNext操作符一致,如果是以throwable抛出的,则会将这个错误发射出去。
原理图如下:
Retry操作符使用如下:
@Override
protected void createObservable() {
super.createObservable();
mObservable = createErrorObservable(false).retry(1);
}
private Observable createErrorObservable(final boolean isException) {
displayLogcat("subscriber");
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
if (isException) {
subscriber.onError(new Exception("exception retry"));
} else {
subscriber.onError(new Throwable("throwable retry"));
}
} else {
subscriber.onNext(i);
}
}
}
});
}
运行代码,结果如下:
RetryWhen
RetryWhen操作符当遇到异常时,retryWhen将onError中的Throwable传递给一个函数,这个函数产生另一个Observable,retryWhen观察它的结果再决定是不是要重新订阅原始的Observable。如果这个Observable发射了一项数据,它就重新订阅,如果这个Observable发射的是onError通知,它就将这个通知传递给观察者然后终止。
原理图如下:
RetryWhen操作符使用如下:
@Override
protected void createObservable() {
super.createObservable();
mObservable = createErrorObservable(false).retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Throwable> observable) {
displayLogcat("retryWhen call");
return observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
// subscriber.onError(new Throwable("123"));
}
});
}
});
}
private Observable createErrorObservable(final boolean isException) {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
displayLogcat("subscriber");
for (int i = 0; i < 5; i++) {
if (i == 3) {
if (isException) {
subscriber.onError(new Exception("exception retry when"));
} else {
subscriber.onError(new Throwable("throwable retry when"));
}
} else {
subscriber.onNext(i);
}
}
}
});
}
运行代码,结果如下:
接下来就是鸣谢了,非常感谢以下两位博主,相关链接如下: