好久没有更新RxJava系列文章了,今天整理一番do系列操作符与大家分享。
对于do系列操作符理解比较容易,他相当于给Observable执行周期的关键节点添加回调。当Observable执行到这个阶段的时候,这些回调就会被触发。
在Rxjava do系列操作符有多个,如doOnNext,doOnSubscribe,doOnUnsubscribe,doOnCompleted,doOnError,doOnTerminate和doOnEach。
当Observable每发送一个数据时,doOnNext会被首先调用,然后再onNext。若发射中途出现异常doOnError会被调用,然后onError。若数据正常发送完毕doOnCompleted会被触发,然后执行onCompleted。当订阅或者解除订阅doOnSubscribe,doOnUnsubscribe会被执行。
举个例子:
Observable.just(1, 2, 3)
.doOnNext(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.e(TAG, "doOnNext: " );
}
})
.doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e(TAG, "doOnError: " );
}
})
.doOnCompleted(new Action0() {
@Override
public void call() {
Log.e(TAG, "doOnCompleted: " );
}
})
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.e(TAG, "doOnSubscribe: " );
}
})
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.e(TAG, "doOnUnsubscribe: " );
}
})
.doOnTerminate(new Action0() {
@Override
public void call() {
Log.e(TAG, "doOnTerminate: " );
}
})
.doAfterTerminate(new Action0() {
@Override
public void call() {
Log.e(TAG, "doAfterTerminate: " );
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted1: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError1: ");
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext1: " + integer);
}
});
输出结果:
doOnSubscribe:
doOnNext:
onNext1: 1
doOnNext:
onNext1: 2
doOnNext:
onNext1: 3
doOnCompleted:
doOnTerminate:
onCompleted1:
doOnUnsubscribe:
doAfterTerminate:
这里要特殊介绍到一个操作符——就是doOnEach:
doOnEach顾名思义,就是在执行观察者的每一个方法之前,都会先执行一遍doOnNext。这里的doOnEach传入一个Subscriber参数,需要实现其三个对应方法,具体参照一下代码:
Observable.just(1,2,3)
.doOnEach(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext: "+integer);
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted1: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError1: " );
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext1: "+integer);
}
});
输出结果:
onNext: 1
onNext1: 1
onNext: 2
onNext1: 2
onNext: 3
onNext1: 3
onCompleted:
onCompleted1:
do系列操作符相对简单,就不做过多介绍了。
更多精彩内容,欢迎关注我的微信公众号——Android机动车