Rxjava2.0

1. 引入

一提Rxjava2.0,第一印象就应该是背压,就像你提到Rxjava就是想到线程调度与链式调用一样,都有代表性标签。

2. 什么是背压?

刚接触到这个名词,感觉超屌的,其实在学习新知识的过程当中都有这么个感觉

  • 初次接触:感觉超吊,不管是名字还是功能方面的
  • 初次学习:感觉怎么这么麻烦,好难学
  • 深入学习:原来就这么点东西,很简单,是我自己想复杂了
  • 学完之后:原来没有想象中那么吊

说了这么多,背压其实也很简单,比如说流水线作业,一个工人一分钟打包一个罐头,但是机器发送给了他5个罐头,工人就处理不了,也就是说工人的工作效率赶不上机器分配的任务(简单这么理解即可),那么解决的思路就有以下几种情况:

  1. 在工人旁边积压,积压越来越多,如果工人心里承受能力(此处也就是说硬件内存)比较大,一直到机器熄火也一直在打包,并且能够打包完毕,这就是不支持背压的。
  2. 工人承受不了这个工作强度,向上级领导报告请求减少工作量(报异常rx.exceptions.MissingBackpressureException)。
  3. 工人自己控制机器发送罐头的数量,我早上打包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. 其他的一些改变

其他就是命名之类的一些改变了,自己去探索发现吧,^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值