rxjava 的GitHub地址 :https://github.com/ReactiveX/RxJava
RXJava是反應式擴展的Java VM實現:一個用於使用可觀察序列組成異步和基於事件的程序的庫。
它擴展了觀察者模式以支持數據/事件的序列,並添加了操作符,允許您聲明性地將序列組合在一起,同時抽象出對諸如低級線程、同步、線程安全和併發數據結構等問題的關注。
1.0版本是截至2018年3月31日的終生。沒有進一步的開發,支持,維護,PRS和更新將發生。最後版本1.3.8的JavaDoc將仍然是可訪問的。
2.0版本特性:
單一依賴性:反應流
繼續支持Java 6+ ,Android 2.3+
通過1.x週期和通過無功流共享項目學習的設計更改獲得性能增益。
Java 8 LAMBDA API
對併發源(線程、池、事件循環、纖維、行動者等)
異步或同步執行
用於參數化併發的虛擬時間和調度程序
版本2.0和1.0將並肩共存數年。它們具有不同的組ID(io.reactivex.rxjava2 vs io.reactivex)和命名空間(io.reactivex vs )。
查看1版本和2版本之間的差異,請查看地址 https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0
剛開始的時候我也是小白一員,感覺rxjava比較難,可是實戰後你會發現,rxjava竟然這麼可愛,輔助你完成很多工作,代碼這玩意不能看,光看你這輩子都是門外漢,動手多練習幾遍,你會發現原來也就這麼回事,已經站在巨人的肩膀上做事了,所以。。。
一、rxjava2.0 相對於1.0來說, 更新中出現了兩種觀察者模式
Observable(被觀察者)/Observer(觀察者), 然而它不支持背壓
Flowable (被觀察者)______subscribe(訂閱)____----->Subscriber(觀察者),支持背壓
二、常用到的操作符
map圖> 通過將一個函數應用到每個項來轉換可觀察到的項
zip 郵編- > 通過指定的函數組合多個觀測值的排放量,並根據此函數的結果爲每個組合發出單個項。
Filter 過濾器- > 僅通過通過謂詞測試的可見對象發出這些項。
flatmap -> 將可觀察到的項目轉換爲觀測值,然後將這些排放量變爲單一觀測值。
Take帶-> 只發出觀察到的第一個n個項。
Reduce 減少-> 將函數應用於可見的、順序的、併發出最終值的每個項目。
Skip 跳過-> 抑制觀察到的第一個n個項。
Buffer 緩衝- > 定期收集由可觀察到的包發出的項,併發出這些束,而不是一次一個地輸出這些項。
Concat 連接兩個字符串-> 從兩個或兩個以上的觀測值中發射,而無需交錯它們。
Replay 重播> 確保所有觀察者看到相同的已發佈項目序列,即使它們在已觀察到已開始發佈項目之後訂閱。
Merge 合併- > 合併多個觀測值合併成一個排放量
三、示例
3.1
Observable.create(new ObservableOnSubscribe<String>() { //Observable.create 是創建被觀察者,
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("123"); //ObservableEmitter 是發射器,向下遊發射數據
e.onNext("456");
e.onNext("789");
}
}).subscribe(new Observer<String>() { //subscribe 訂閱觀察者,說法有點彆扭,所以,現在統稱接收器
private Disposable disposable;
private String string;
/**
* 用於解除訂閱
* @param d
*/
@Override
public void onSubscribe(@NonNull Disposable d) {
disposable = d;
}
@Override
public void onNext(@NonNull String string) {
Log.e("---->", string);
textView.setText(string);
if (string.equals("456")) {
disposable.dispose(); //當上遊條件滿足某個條件的時候,解除訂閱關係
}
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
}
//注意了,onError 和 onComplete 方法是隻會有一個執行,不管是哪個方法執行了,當前的訂閱關係都解除終止了
@Override
public void onComplete() {
Log.e("--->", "完成");
}
});
3.2
Observable.create((e) -> { //此處使用了lambda表達式
e.onNext(999);
e.onNext(9996);
e.onNext(999666);
//subscribeOn 用於指定 subscribe() 時所發生的線程
}).subscribeOn(Schedulers.newThread()) //總是啓用新線程,並在新線程執行操作。
.subscribeOn(Schedulers.io()) //(注意,本次指定io線程無效)指定 subscribe() 事件發送發生在 IO 線程;Schedulers.io() 代表io操作的線程, 通常用於網絡,讀寫文件等io密集型的操作;
.observeOn(AndroidSchedulers.mainThread()) //指定下游Subscriber 的回調處理髮生在主線程, 指定的操作將在 Android 主線程運行
.doOnNext(new Consumer() {
@Override //接收
public void accept(@NonNull Object integer) throws Exception {
textView2.setText(integer+"--main--"+Thread.currentThread().getName());
Log.e("-->>", (Integer.valueOf(integer.toString())) + "----"+Thread.currentThread().getName());
Schedulers.io().createWorker().schedule(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
})
.observeOn(Schedulers.io()) //指定io流線程
.subscribe(new Consumer<Integer>() { //Consumer 即消費者,用於接收單個值,BiConsumer 則是接收兩個值,
// Function 用於變換對象,Predicate 用於判斷
@Override
public void accept(Integer integer) throws Exception {
textView.setText(integer + "--io--"+Thread.currentThread().getName());
Log.e("----2----->>", integer + "----"+Thread.currentThread().getName());
}
});
該文爲基本使用,後面會接着寫完這幾個操作符,有問題請指出,我也在學習階段