RxJava2组合操作符篇

作者: 惜梦哥哥_ | 来源:发表于2017-05-23 13:08 被阅读223次
    最近单位项目超级忙,文章写好了,一直没空配图一直没发,今天好不容易忙里偷闲,赶紧来补一篇.
    先来一个好消息
    Paste_Image.png

    Google大大将Kotlin将作为安卓一级语言,你还不知道Kotlin是啥? 你Out了,快来和Kotlin打个招呼吧 QAQ
    http://www.jianshu.com/p/e41d96c52484

    正题

    进入我们的正题,本次文章继续讲解RxJava2中剩下的操作符,组合操作符.

    首先一说组合操作符,当然是把一些东西组合到一起啦,没错没错,大概就是这个意思,首先我们先来看一个 ---- zip

    zip操作符:
    谈到zip这,是不是立马就想到了WinRAR这个东西?


    WinRAR.png

    不错不错,这个操作符和WinRAR类似,把多个东西压缩到一起,但是是不是我们传多少东西都能压缩呢,我们来看一下,老规矩,上代码:

    Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> e) throws Exception {
            e.onNext(1);
            e.onNext(2);
            e.onNext(3);
            e.onNext(4);
        }
    });
    
    Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> e) throws Exception {
            e.onNext("这是");
            e.onNext("这个是");
            e.onNext("这个则是");
        }
    });
    
    Observable<String> observable2 = Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> e) throws Exception {
            e.onNext("个");
            e.onNext("只");
            e.onNext("条");
            e.onNext("张");
            e.onNext("本");
            e.onNext("副");
        }
    });
    
    Observable.zip(observable, observable1, observable2, new Function3<Integer, String, String, String>() {
        @Override
        public String apply(Integer integer, String s, String s2) throws Exception {
            return s + integer + s2;
        }
    }).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            Log.e("XYK",s);
        }
    });
    

    运行结果:

    Paste_Image.png

    我们可以看到,3条上游中分别有4个事件,3个事件,6个事件,经过zip操作符操作之后为什么就只变成了3个事件了呢?我们来打下Log,看看其他事件去哪了.

    添加Log之后的运行结果:

    Paste_Image.png

    根据运行结果可以看到,上游逐条发送到下游,下游在接收到最后一条上游发送过来的事件之后开始组合,而多余的数据也被发送了,但是并没有被进行组合,这样是不是就看明白了呢?但是这时候有问题了,组合完成之后,多余的数据依旧在发送,如果我们不停发呢?会产生什么后果?,我们来修改一下observable
    的代码:

    Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> e) throws Exception {
            for (int i = 0; ; i++) {
                Log.e("XYK",i + "");
                e.onNext(i);
            }
        }
    });
    

    运行之后通过Monitors我们查看一下内存:(Sorry,这里没截下图来....可以自己试一下,不过想一下也知道,内存肯定会暴增嘛...)

    在内存持续暴增的情况下,可能用不了多久就会OOM,这种情况下我们应该怎么办呢?

    还记不记得上篇文章写了啥,过滤啊,我们把不需要的过滤掉不就好了

    Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> e) throws Exception {
            for (int i = 0; ; i++) {
                e.onNext(i);
            }
        }
    }).filter(new Predicate<Integer>() {
        @Override
        public boolean test(Integer integer) throws Exception {
            return integer % 100 == 0;
        }
    });
    

    当然,除此之外还有很多办法,可以根据实际情况来进行组合应用.

    总结一下:由此我们可以得出一个结论:RxJava中的zip操作符作用是将多条上游发送的事件进行结合到一起,发送到下游,并且按照顺序来进行结合,如多条上游中发送的事件数量不一致,则以最少的那条中的事件为准,下游接收到的事件数量和其相等.

    结尾

    刚好写完也该上班了,但愿你们都不知道我们公司在哪,别举报我上班写文章玩,结尾推荐首歌吧:

    song.png

    可以学学给你的女朋友,小媳妇唱,JJ的歌里很好听的一首,没有之一.

    相关文章

      网友评论

      本文标题:RxJava2组合操作符篇

      本文链接:https://www.haomeiwen.com/subject/ipwwxxtx.html