前言:
在瞭解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 的實例