RxJava2.0使用总结

这里是我对Rxjava2.0的一些学习总结,在此记录一下,以后用的时候也方便查找。

如何使用RxJava2

在Android中使用RxJava2只需要在app下的Gradle文件中配置以下两句即可:

   compile 'io.reactivex.rxjava2:rxjava:2.0.1'
   compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

了解了如何使用Rxjava2,基础的东西就先不提,这里说一下RxJava2中一些重要的操作符吧。
事件是从产生它的地方(上游),传递到接收它的地方(下游)。在这个传递的过程中我们可以通过一系列的操作符对数据进行修改。

操作符之Map

map操作符用于转换一组数据,可以是对数据简单的加减乘除这种转换,也可以将一个类转成另一个类。并且map是单一转换,看下面代码:

        Flowable.just(123)
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return 123+"456";
                    }
                }).subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.e("accept", "======" + s);
                    }
                });

按照以上的代码来说,上游发送的数据是123,下游也应该接收到123,不过这里我们用map进行了变换,把123这个数字改成了“123456”这个字符串。所以打印结果是:

10-11 16:02:39.400 6374-6374/com.example.administrator.rxdemo E/accept: ======123456

也就是说map在对Flowable对象进行变换之后返回了一个新的Flowable对象,然后进行之下的操作。

操作符之FlatMap

flatMap操作符的作用是将上游发送来的单个事件都转化成一个新的Flowable,这个Flowable中又包含若干个事件。然后发送这些事件。看下面代码:

    Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(11);
                e.onNext(12);
                e.onNext(13);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
           .flatMap(new Function<Integer, Publisher<String>>() {
            @Override
            public Publisher<String> apply(Integer integer) throws Exception {
                List<String> list=new ArrayList<String>();
                for (int i = 0; i < 2; i++) {
                    list.add(integer+"abc");
                }
                return Flowable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e("accept", "======" + s);
            }
        });

打印结果是:

.administrator.rxdemo E/accept: ======11abc
.administrator.rxdemo E/accept: ======11abc
.administrator.rxdemo E/accept: ======12abc
.administrator.rxdemo E/accept: ======12abc
.administrator.rxdemo E/accept: ======13abc
.administrator.rxdemo E/accept: ======13abc

flatMap不保证事件发送的顺序,也就是说上面代码的顺序不见得就是11abc,12abc,13abc,上面代码没有体现出无序的特点,发送事件的时候加上几秒延迟就能看到了。

操作符之ConcatMap

concatMap的做用和flatMap一模一样,唯一的区别就在于cancatMap保证事件发送的顺序是有序的,即严格按照上游发送的顺序。

操作符之take
take操作符非常简单,用于指定订阅者最多收到多少数据,使用起来也是很简单:

   .take(12)

这里就表示订阅者最多能接收到12个数据。

操作符之filter

filter操作符的作用是过滤数据,也就是对于上游发送的数据进行筛选,看代码:

         Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(10);
                e.onNext(11);
                e.onNext(12);
                e.onNext(13);
                e.onNext(14);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
           .filter(new Predicate<Integer>() {
               @Override
               public boolean test(Integer integer) throws Exception {
                   if(integer>12){
                       return true;
                   }
                   return false;
               }
           }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("accept", "======" + integer);
            }
        });

打印结果是:

.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======14

通过代码和打印结果可以清楚的看到通过filter操作符筛选之后,从上游发送的数据10,11,12,13,14,并没有完全被下游接收。只有13,14被接收了。也就是说filter操作符起了作用。

操作符之doOnNext

doOnNext的作用就是在每个事件被处理之前做一些操作。下面代码我是让每次处理事件之前都打印一句“哈哈哈”,看代码就清楚了:

        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(12);
                e.onNext(13);
                e.onNext(14);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
         .doOnNext(new Consumer<Integer>() {
             @Override
             public void accept(Integer integer) throws Exception {
                 Log.e("accept", "======" + "哈哈哈");
             }
         }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("accept", "======" + integer);
            }
        });

注意看打印结果:

.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======12
.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======14

很清楚了,每次处理事件(打印数字)之前都先做了打印“哈哈哈”这件事,也就是我们的doOnNext操作符起了作用。

操作符之zip
zip操作符的目的是合并多个被观察者的数据流,然后发送最终合并的数据。有一种场景是 当某界面内容来源不同,但需同时显示出来时。这时候就可以使用zip操作符,zip操作符可以将几方数据组合好后同时展示出来。
zip事件的过程就是分别从发射器 A 和发射器 B 各取出一个事件来组合,并且一个事件只能被使用一次,组合的顺序是严格按照事件发送的顺序来进行的,比如,A为12345,B为ABCD,1 永远是和 A 结合的,2 永远是和 B 结合的。
最终接收器收到的事件数量是和发送器发送事件最少的那个发送器的发送事件数目相同。

Rxjava2中的操作符有很多,这里只写出了一小部分。趁着刚学了记录一下。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容