对RxJava2理解的总结

版权声明:本文为博主原创文章,未经博主允许,也可以随意转载。但麻烦,加个友情链接,增加点人气。 https://blog.csdn.net/l_o_s/article/details/79402761

前言:
如果你在看过诸多RxJava2相关的文章,仍然对RxJava2没有一个整体的认识的话,可以看一下这篇文章。全篇,以问答的形式,由简入繁,一步步带你认识RxJava2。如果你还没有学过RxJava2,那可以参考这篇 :RxJava 2.x 入门教程

1、什么是RxJava2?
答:RxJava2是一个工具,也是一个库。

2、什么是工具或是库?
答:工具,就是用来做事的。比如,剪刀可以用来剪纸。

3、那么,RxJava2是用来做什么的工具?
答:RxJava2是一个基于观察者模式,以响应流的形式处理异步请求的工具。

4、那它是怎么处理的?
答:因为RxJava2基于观察者模式,所以,得先创建两个对象:被观察者和观察者。然后,再通过多种数据的处理方法,比如:过滤操作、组合操作、转换操作、背压策略等等,来实现对数据的异步请求处理。

5、Observable和Flowable,有什么区别?
答:Observable不支持背压,Flowable支持背压。

6、那什么是背压?
答:因为观察者模式,是被观察者(上游)通知观察者(下游)事件的改变,所以,不免会出现这样的问题:上游通知事件改变的速度,远远大于下游处理事件通知的速度。比方说:上游,从数据库里拿用户数据。下游,对用户数据进行处理。但上游,拿的速度过快,下游,处理的速度过慢时。上游的数据就会不断的积压,最后导致缓存爆了。这个时候,就得有背压支持处理。背压,通过不同的策略,来控制上游的事件处理速度。。。这样,如果下游在1秒内只能处理10条,他就告诉上游我只要10条。就不会出现缓存爆了的情况。那剩下的其它堆积事件怎么处理?有不同的背压策略处理它们,比如丢弃,抛出异常,加大缓存。简言之,背压就是一种能够控制上游事件通知的速度的策略。

7,听起来好抽象,能用代码辅助解释下?
答:那先看Observable的:

   // 模仿事件积压
    private void doObservable() {

        Observable.create(new ObservableOnSubscribe<Double>() {
            @Override
            public void subscribe(ObservableEmitter<Double> emitter) throws Exception {
                for (double i = 0; i < 1_000_000_000_000D; ++i) {
                    emitter.onNext(1_000_000_000_000D);
                }
                emitter.onComplete();
            }
        }).observeOn(Schedulers.newThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Observer<Double>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        //   d.dispose();
                    }

                    @Override
                    public void onNext(Double aDouble) {
                        try {
                            log("integer-1=" + aDouble + RxJava2Demo.getThreadName());
                            // 模仿事件积压
                            Thread.sleep(100_000);
                        }catch (Exception e){
                            log("onNextError=" + e.getMessage());
                        }
                        log("integer-2=" + aDouble + RxJava2Demo.getThreadName());
                    }

                    @Override
                    public void onError(Throwable t) {
                        log("onError=" + t.getMessage() + RxJava2Demo.getThreadName());
                    }

                    @Override
                    public void onComplete() {
                        log("onComplete=" + RxJava2Demo.getThreadName());
                    }
                });
    }

Observable会限制上游通知事件的速度为1,即每次都会处理完onNext里面的代码。不管你的onNext执行了多久,都得等到onNext执行完,再调用subscribe(),继续下一个事件的通知。这样,就会有一个问题,当上游的事件积累到一定程度的时候,就会爆发OOM。要解决这个问题,就需要用Flowable,这个支持背压的API。注意,因为安卓系统会不断的进行GC操作,而且这里只是一个double,我的手机也有6G运行内存,所以,崩溃的概率是不可保证的,我的手机在运行好几分钟后,崩了。为了确保可以崩溃,你可以自己另行测试,做一些数据库或文件读取的,加载大数据的操作。

再看Flowable的代码

 private void doFlowable() {

        Flowable.create((FlowableOnSubscribe<Double>) emitter -> {

            for (double i = 0; i < 128; ++i) {
                emitter.onNext(i);
            }

            emitter.onComplete();
        }, BackpressureStrategy.ERROR)
                .subscribeOn(Schedulers.newThread())
                .observeOn(Schedulers.newThread())
                .subscribe(new Subscriber<Double>() {
                    @Override
                    public void onSubscribe(Subscription s) {
                        s.request(128);
                    }

                    @Override
                    public void onNext(Double aDouble) {

                        log("integer=" + aDouble + RxJava2Demo.getThreadName());
                        try {
                            Thread.sleep(1_500);
                        } catch (Exception e) {
                            log("onNext=" + e.getMessage());
                        }

                    }

                    @Override
                    public void onError(Throwable t) {
                        log("onError=" + t.getMessage() + RxJava2Demo.getThreadName());
                    }

                    @Override
                    public void onComplete() {
                        log("onComplete=" + RxJava2Demo.getThreadName());
                    }
                });
    }

Flowable支持背压,背压有多种策略,这里用的是ERROR。支持背压,也即意味着,它有能力去处理事件的堆积。但是,Flowable的缓存池只有128个。所以,一次性发送的事件也不能超过128个,否则会抛出异常,触发onError()方法。不同的策略,对于积压的事件,有不同的处理。具体,可以参考一些其它的博客:背压详解

明白了,谢谢你的分享。
答:不用谢,有问题再继续说。

猜你喜欢

转载自blog.csdn.net/l_o_s/article/details/79402761