Android RxJava2的更新

前言:
在瞭解RxJava2.0的更新前,首先了解一個概念“背壓”backpressure。
從字面意思理解就是:你在完成一件事的時候,後面一直在增加事情。在事情增加到你完成不了的時候就會崩潰。
在RxJava中,如果被觀察者一直髮送事件,觀察者的事件處理速度跟不上事件發送速度,事件就會一直累積,直到內存奔潰。
網上有網友對背壓(Backpressure)做一個明確的定義:背壓是指在異步場景中,被觀察者發送事件速度遠快於觀察者的處理速度的情況下,一種告訴上游的被觀察者降低發送速度的策略
具體的實現方式是響應式拉取 reactive pull:即觀察者主動從被觀察者那裏去拉取數據,而被觀察者變成被動的等待通知再發送數據。

參考:

https://zhuanlan.zhihu.com/p/24473022?refer=dreawer
http://www.jianshu.com/p/220955eefc1f

關於RxJava2.0更新:

1 . 觀察者模式

首先聲明,RxJava以觀察者模式爲骨架,在2.0中依然如此。

不過此次更新中,出現了兩種觀察者模式:

Observable(被觀察者)/Observer(觀察者)
Flowable(被觀察者)/Subscriber(觀察者)

RxJava2.X中,Observeable用於訂閱Observer,是不支持背壓的,而Flowable用於訂閱Subscriber,是支持背壓(Backpressure)的。

Observable正常用法:

Observable mObservable=Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onComplete();
            }
        });

Observer mObserver=new Observer<Integer>() {
            //這是新加入的方法,在訂閱後發送數據之前,
            //回首先調用這個方法,而Disposable可用於取消訂閱
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer value) {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };

mObservable.subscribe(mObserver);

Flowable/Subscriber

Flowable.range(0,10)
        .subscribe(new Subscriber<Integer>() {
            Subscription sub;
            //當訂閱後,會首先調用這個方法,其實就相當於onStart(),
            //傳入的Subscription s參數可以用於請求數據或者取消訂閱
            @Override
            public void onSubscribe(Subscription s) {
                Log.w("TAG","onsubscribe start");
                sub=s;
                //在代碼中,傳遞事件開始前的onstart()中,調用了request(1),通知被觀察者先發送一個事件,然後在onNext()中處理完事件,再次調用request(1),通知被觀察者發送下一個事件....
                sub.request(1);
                Log.w("TAG","onsubscribe end");
            }

            @Override
            public void onNext(Integer o) {
                Log.w("TAG","onNext--->"+o);
                sub.request(1);
            }
            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
            }
            @Override
            public void onComplete() {
                Log.w("TAG","onComplete");
            }
        });

2 .操作符相關

Action相關

之前我在文章裏介紹過關於Action這類接口,在1.0中,這類接口是從Action0,Action1…往後排(數字代表可接受的參數),現在做出了改動

Rx1.0———–Rx2.0

Action1——–Action
Action1——–Consumer
Action2——–BiConsumer
後面的Action都去掉了,只保留了ActionN

Function相關
同上,也是命名方式的改變

3 . 線程調度

可以說這一塊兒基本也沒有改動,如果一定要說的話。

那就是去掉了Schedulers.immediate()這個線程環境
移除的還有Schedulers.test()(我好像從來沒用過這個方法)
io.reactivex.Scheduler這個抽象類支持直接調度自定義線程任務(這個我也沒怎麼用)

補充2

在RxJava1.0中,有的人會使用CompositeSubscription來收集Subscription,來統一取消訂閱,現在在RxJava2.0中,由於subscribe()方法現在返回void,那怎麼辦呢?

其實在RxJava2.0中,Flowable提供了subscribeWith這個方法可以返回當前訂閱的觀察者,並且通過ResourceSubscriber DisposableSubscriber等觀察者來提供 Disposable的接口。

所以,如果想要達成RxJava1.0的效果,現在應該是這樣做:

CompositeDisposable composite = new CompositeDisposable();

composite.add(Flowable.range(1, 8).subscribeWith(subscriber));

這個subscriber 應該是 ResourceSubscriber 或者 DisposableSubscriber 的實例

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