本文只是通過例子,把concat操作符中自定義Observable中onNext,onError,onComplte在subscribe後的執行順序打印出來給大家看看.(concat操作符的作用是連接操作符,可接受Observable的可變參數,或者Observable的集合然後順序的發送出去,注意是有序的發送,那麼這個就可以應用在開發中很多有序的事件,比如接廣告…)
廢話不多說,我們先看下沒有執行之前的代碼
observable1
Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
LogUtil.d("Emitter : 1");
e.onNext(2);
LogUtil.d("Emitter : 2");
e.onComplete();
LogUtil.d("onComplete1");
}
});
observable2
Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(3);
LogUtil.d("Emitter : 3");
e.onNext(4);
LogUtil.d("Emitter : 4");
e.onComplete();
LogUtil.d("onComplete2");
}
});
subscribe
Observable.concat(observable1, observable2)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
LogUtil.d("onNext : " + integer + "\n");
}
}, new Consumer<Throwable>() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
LogUtil.d("Throwable");
}
}, new Action() {
@Override
public void run() throws Exception {
LogUtil.d("onComplete");
}
});
OK,那麼我們首先運行一下,看下是什麼結果…
D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onNext : 2
D/leo: Emitter : 2
D/leo: onComplete1
D/leo: onNext : 3
D/leo: Emitter : 3
D/leo: onNext : 4
D/leo: Emitter : 4
D/leo: onComplete2
D/leo: onComplete
一切都很正常,如果我們把1中的onComplete取消掉呢?
Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
LogUtil.d("Emitter : 1");
e.onNext(2);
LogUtil.d("Emitter : 2");
//e.onComplete();
// LogUtil.d("onComplete1");
}
});
結果是
D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onNext : 2
D/leo: Emitter : 2
結論:如果自定義Observable使用在Concat中,如果要想執行下一個Observable那麼前一個Obeservable必須要執行onComplete方法
如果1中的onComplete放開,2中onComplete註釋掉的話:
Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(3);
LogUtil.d("Emitter : 3");
e.onNext(4);
LogUtil.d("Emitter : 4");
// e.onComplete();
//LogUtil.d("onComplete2");
}
});
結果是:
D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onNext : 2
D/leo: Emitter : 2
D/leo: onComplete1
D/leo: onNext : 3
D/leo: Emitter : 3
D/leo: onNext : 4
D/leo: Emitter : 4
結論:concat中所有的Observable都要走完onComplete方法,不然 subscribe中的onComplete將不會執行
如果將1中的onComplete放在onNext(2)之前:
Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
LogUtil.d("Emitter : 1");
e.onComplete();
LogUtil.d("onComplete1");
e.onNext(2);
LogUtil.d("Emitter : 2");
}
});
結果是:
D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onComplete1
D/leo: Emitter : 2
D/leo: onNext : 3
D/leo: Emitter : 3
D/leo: onNext : 4
D/leo: Emitter : 4
D/leo: onComplete2
D/leo: onComplete
結論:自定義observable中 onComplete方法後的onNext會發送 但是subscribe並不會接受到.
我們把1,2中的onComplete之前加onError方法呢:
1. e.onNext(1);
LogUtil.d("Emitter : 1");
e.onNext(2);
LogUtil.d("Emitter : 2");
e.onError(new AndroidException("error"));
LogUtil.d("error1");
e.onComplete();
LogUtil.d("onComplete1");
2. e.onNext(3);
LogUtil.d("Emitter : 3");
e.onNext(4);
LogUtil.d("Emitter : 4");
e.onError(new AndroidException("error"));
LogUtil.d("error2");
e.onComplete();
LogUtil.d("onComplete2");
結果是:
D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onNext : 2
D/leo: Emitter : 2
D/leo: error1
D/leo: onComplete1
D/leo: Throwable
結論:onError方法走後,後面的方法會發送 但是不會被subscribe接受 而後面的Observable將不會被執行
那如果把1中的onComplete放在onError之前呢 會發生什麼:
e.onNext(1);
LogUtil.d("Emitter : 1");
e.onNext(2);
LogUtil.d("Emitter : 2");
e.onComplete();
LogUtil.d("onComplete1");
e.onError(new AndroidException("error"));
LogUtil.d("error1");
首選結果是:
D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onNext : 2
D/leo: Emitter : 2
D/leo: onComplete1
但是同時APP直接崩潰了,並且報了一個錯誤
io.reactivex.exceptions.UndeliverableException: android.util.AndroidException: error
這個錯誤在同時有兩個onError也會報(這樣的情況我之前遇到過,在接廣告的時候 我在廣告SDK返回adFailed方法中調用了onError),這個錯誤我暫時的理解是 onComplete執行後 自身的Observable不再有發送onError的能力 同時 OnError執行後不再有發送OnError的能力 就會報這個錯誤 如果有遇到這個錯誤 那麼請檢查自己Observable裏面有沒有這樣的順序.