参考:
RxJava合并Observable——merge和mergeDelayError操作符
示例:
public void mergeArray() {
Observable[] array = getObservables();
Observable.mergeArray(array)
.subscribe(getObserver());
}
//======onSubscribe=======
//======onNext o=======1
//======onNext o=======2
//======onNext o=======3
//======onNext o=======4
//======onError 总=======--error2--
//异常后正常数据立即终止发送
//mergeDelayError在合并和交错输出上和merge一样,
// 但是mergeDelayError的原始observable出现onError时,错误通知会被保留,
// 直到所有数据发射完毕后才执行onError。如果有多个原始observable出现了onError,
// 这些onError通知会被合并成一个CompositeException ,
// 保留在它的 List<Throwable> exceptions异常列表里。
// 如果只有一个原始observable出现了onError,
// 则会直接使用这个onError通知,而不会生成CompositeException。
public void mergeArrayDelayError() {
Observable[] array = getObservables();
Observable.mergeArrayDelayError(array)
.subscribe(getObserver());
}
//======onSubscribe=======
//======onNext o=======1
//======onNext o=======2
//======onNext o=======3
//======onNext o=======4
//======onNext o=======5
//======onNext o=======6
//======onNext o=======7
//======onNext o=======8
//======onNext o=======9
//======onError each=======--error1--
//======onError each=======--error2--
//======onError 总=======2 exceptions occurred.
//正常数据都会走完,异常总是在最后,而且合并后走onError
private Observable[] getObservables() {
ArrayList<Observable> observables = new ArrayList<>();
Observable observable1 = Observable.just(1, 2, 3)
.subscribeOn(Schedulers.io())//注意:这里指定线程
.observeOn(AndroidSchedulers.mainThread());
Observable observable2 = Observable.just(4, 5, 6)
.subscribeOn(Schedulers.io())//注意:这里指定线程
.observeOn(AndroidSchedulers.mainThread());
Observable observable3 = Observable.just(7, 8, 9)
.subscribeOn(Schedulers.io())//注意:这里指定线程
.observeOn(AndroidSchedulers.mainThread());
Observable<Object> error1 = Observable.error(new Error("--error1--"))
.subscribeOn(Schedulers.io())//注意:这里指定线程
.observeOn(AndroidSchedulers.mainThread());
Observable<Object> error2 = Observable.error(new Error("--error2--"))
.subscribeOn(Schedulers.io())//注意:这里指定线程
.observeOn(AndroidSchedulers.mainThread());
observables.add(observable1);
observables.add(error1);
observables.add(observable2);
observables.add(error2);
observables.add(observable3);
return observables.toArray(new Observable[observables.size()]);
}
private Observer getObserver() {
return new Observer() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("======onSubscribe=======");
}
@Override
public void onNext(Object o) {
System.out.println("======onNext o=======" + o);
}
@Override
public void onError(Throwable e) {
//CompositeException :
//如果有多个原始observable出现了onError,
//这些onError通知会被合并成一个CompositeException ,
//保留在它的 List<Throwable> exceptions异常列表里。
//如果只有一个原始observable出现了onError,
//则会直接使用这个onError通知,而不会生成CompositeException。
if (e instanceof CompositeException) {
CompositeException compositeException = (CompositeException) e;
List<Throwable> exceptions = compositeException.getExceptions();
if (exceptions != null && exceptions.size() > 0) {
for (int i = 0; i < exceptions.size(); i++) {
System.out.println("======onError each======="
+ exceptions.get(i).getMessage());
}
}
}
System.out.println("======onError 总=======" + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("======onComplete=======");
}
};
}