Rxjava2.0 之第一篇

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());
    }
});

該文爲基本使用,後面會接着寫完這幾個操作符,有問題請指出,我也在學習階段

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章