1. 引入
一提Rxjava2.0,第一印象就应该是背压,就像你提到Rxjava就是想到线程调度与链式调用一样,都有代表性标签。
2. 什么是背压?
刚接触到这个名词,感觉超屌的,其实在学习新知识的过程当中都有这么个感觉
- 初次接触:感觉超吊,不管是名字还是功能方面的
- 初次学习:感觉怎么这么麻烦,好难学
- 深入学习:原来就这么点东西,很简单,是我自己想复杂了
- 学完之后:原来没有想象中那么吊
说了这么多,背压其实也很简单,比如说流水线作业,一个工人一分钟打包一个罐头,但是机器发送给了他5个罐头,工人就处理不了,也就是说工人的工作效率赶不上机器分配的任务(简单这么理解即可),那么解决的思路就有以下几种情况:
- 在工人旁边积压,积压越来越多,如果工人心里承受能力(此处也就是说硬件内存)比较大,一直到机器熄火也一直在打包,并且能够打包完毕,这就是不支持背压的。
- 工人承受不了这个工作强度,向上级领导报告请求减少工作量(报异常rx.exceptions.MissingBackpressureException)。
- 工人自己控制机器发送罐头的数量,我早上打包2罐头/min,我就让机器发1罐/min,我下午累了,只能打包1/min,那我就让机器发1/min,这就是支持背压的方式进行处理数据。
第三种则是背压,背压其实就是一种策略,用于控制流速,再具体一点就是通过响应式拉取的方式。
3. Rxjava2.0中的背压策略
1.x总结来只有一对好基友
Observable(被观察者)
Observer or Subscriber(观察者)
2.0通过背压这一个分水岭,搞出来两队好基友
Observable(被观察者)---Observer(观察者)
Flowable(被观察者)---Subscriber(观察者)
Observable-Observer这一对是不支持背压的组合,现在2.0不会报MissingBackpressureException异常,只会OOM,sample:
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>() {
//对比1.x新增的方法,订阅之后,发送数据之前先调用此方法,当然通过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(观察者) 支持背压的组合,sample:
Flowable.range(0,10)
.subscribe(new Subscriber<Integer>() {
Subscription mySub;
//当订阅后先调用的方法
//传入的Subscription s参数可以用于请求数据或者取消订阅
@Override
public void onSubscribe(Subscription s) {
mySub=s;
mySub.request(1);
}
@Override
public void onNext(Integer o) {
mySub.request(1);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
}
});
4. 其他的一些改变
其他就是命名之类的一些改变了,自己去探索发现吧,^_^