前言:
在了解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 的实例