concat操作符:串行合并多个观察者中的事件。
firstElement操作符:按照顺序依次遍历被观察者中事件,事件不为空,则停止遍历。
该例子为:我们平时开发中的数据缓存功能。
1.首先获取内存缓存中的数据,如果数据为空,获取硬盘缓存中的数据。
2.获取硬盘缓存中的数据,如果硬盘缓存中数据为空,则从网络中获取数据。
3.获取网络中的数据。
获取到数据之后发送事件。
private String memoryData;//内存缓存的数据
private String diskData = "缓存中的数据";//磁盘缓存的数据
private String netWorkData="网络中的数据";//网络获取的数据
/**
* 分别依次遍历,如果前面的数据为空,则往后面获取数据
* 即1.先获取内存缓存的数据,如果为空
* 2.获取磁盘缓存中的数据,如果为空
* 3.获取网络的数据
*/
private void getData(){
//三个数据源封装成了三个被观察者对象
Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
if(memoryData==null){
e.onComplete();
}
else{
e.onNext(memoryData);
}
}
});
Observable<String> observable2= Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
if(diskData==null){
e.onComplete();
}
else{
e.onNext(diskData);
}
}
});
Observable<String> observable3 = Observable.just(netWorkData);
//对三个被观察者串行合并成一个队列
Observable.concat(observable1,observable2,observable3)
.firstElement()//从串行队列依次按顺序遍历事件,取出数据,如果取到,则发送事件,停止遍历。
.subscribe(new Consumer<String>() {
@Override
public void accept(String o) throws Exception {
Log.e(TAG, "获取到的数据: "+ o);
}
});
}
输出结果:
image.png
网友评论