最近单位项目超级忙,文章写好了,一直没空配图一直没发,今天好不容易忙里偷闲,赶紧来补一篇.
先来一个好消息
Paste_Image.pngGoogle大大将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的歌里很好听的一首,没有之一.
网友评论