RxJava2组合操作符篇

最近单位项目超级忙,文章写好了,一直没空配图一直没发,今天好不容易忙里偷闲,赶紧来补一篇.
先来一个好消息
RxJava2组合操作符篇_第1张图片
Paste_Image.png

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

正题

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

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

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


WinRAR.png

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

Observable observable = Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(ObservableEmitter e) throws Exception {
        e.onNext(1);
        e.onNext(2);
        e.onNext(3);
        e.onNext(4);
    }
});

Observable observable1 = Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(ObservableEmitter e) throws Exception {
        e.onNext("这是");
        e.onNext("这个是");
        e.onNext("这个则是");
    }
});

Observable observable2 = Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(ObservableEmitter e) throws Exception {
        e.onNext("个");
        e.onNext("只");
        e.onNext("条");
        e.onNext("张");
        e.onNext("本");
        e.onNext("副");
    }
});

Observable.zip(observable, observable1, observable2, new Function3() {
    @Override
    public String apply(Integer integer, String s, String s2) throws Exception {
        return s + integer + s2;
    }
}).subscribe(new Consumer() {
    @Override
    public void accept(String s) throws Exception {
        Log.e("XYK",s);
    }
});

运行结果:

Paste_Image.png

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

添加Log之后的运行结果:

RxJava2组合操作符篇_第2张图片
Paste_Image.png

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

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

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

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

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

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

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

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

结尾

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

RxJava2组合操作符篇_第3张图片
song.png

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

你可能感兴趣的:(RxJava2组合操作符篇)