您的位置:首页 > 编程语言 > Java开发

RxJava操作符(5)-错误

2016-08-13 13:45 246 查看

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) {

4000
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);
}
}
}
});
}


运行代码,结果如下:



接下来就是鸣谢了,非常感谢以下两位博主,相关链接如下:
https://mcxiaoke.gitbooks.io/rxdocs/content/operators/Error-Handling-Operators.html

http://mushuichuan.com/2015/12/11/rxjava-operator-5/

github地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  rxjava 错误操作符