更多文章請點擊:http://77blogs.com/?p=170
轉載請標明出處:https://www.cnblogs.com/tangZH/p/12088332.html,http://77blogs.com/?p=170
使用場景一:
現在要執行兩個任務:
1、輸出字符串0
2、輸出字符串1
我們就可以使用concat來實現多個數據源。
1、輸出字符串0的數據源:
Observable observableLocal = Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { emitter.onNext("0"); emitter.onComplete(); } }).subscribeOn(Schedulers.io());
2、輸出字符串1的數據源:
Observable observableNet = Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { emitter.onNext("1"); emitter.onComplete(); } }).subscribeOn(Schedulers.io());
3、接收多個數據源:
Observable.concat(observableLocal, observableNet) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(Object o) throws Exception { Log.d(TAG, (String) o); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.d(TAG, throwable.getMessage()); } }); }
可以看到Log:
12-23 20:23:48.771 23643-23643/com.status.rxjavasample D/RxJavaHelper: 0
12-23 20:23:48.771 23643-23643/com.status.rxjavasample D/RxJavaHelper: 1
兩個字符串都輸出了,而且是有序的。
使用場景二、
獲取數據,如果從本地緩存中獲取得到數據,那么便不從網絡獲取,否則從網絡獲取。
我們將上面的1,2兩個步驟分別當成從本地緩存獲取數據和從網絡緩存中獲取數據,那么我們需要改變上面的3步驟。
Observable.concat(observableLocal, observableNet) .firstElement() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(Object o) throws Exception { Log.d(TAG, (String) o); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.d(TAG, throwable.getMessage()); } }); }
唯一不同的是加上.firstElement()。
輸出的log為:
12-23 20:29:11.731 24458-24458/com.status.rxjavasample D/RxJavaHelper: 0
firstElement操作符:按照順序依次遍歷被觀察者中事件,事件不為空,則停止遍歷。