学习RxJava2.0的一些记录

来源:互联网 发布:淘宝个人主页在哪 编辑:程序博客网 时间:2024/05/17 22:53

RxJava2的几个常用操作符

这里是我对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操作符可以把一个事件转换成另一个事件,看下面代码:

        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操作符起了作用。

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

原创粉丝点击