学习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中的操作符有很多,这里只写出了一小部分。趁着刚学了记录一下。
- 学习RxJava2.0的一些记录
- Rxjava2.x学习记录(三)
- RxJava2.0学习总结
- Android 积累一些RxJava2.0有关的知识
- 最简单易懂的RxJava2.0学习教程之RxJava2的基本使用(一)
- 最简单易懂的RxJava2.0学习教程之RxJava2的线程调度(二)
- RxJava2.0的使用
- RxJava2.0的创建
- RxJava2.0笔记记录(一)
- 学习PD的一些记录
- 学习HTML的一些记录
- Hibernate的一些学习记录
- 学习Socket的一些记录
- 学习Pandas的一些记录
- 学习java的一些记录
- PHP的一些学习记录
- Rxjava2学习
- RxJava2.0的使用-1
- 关于分治法归并排序的个人笔记
- MySQL NULL 值处理(整理)
- 解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...的问题
- 经典论文翻译导读之《Google File System》
- Hadoop学习笔记(一)初识Hadoop
- 学习RxJava2.0的一些记录
- 使用CEfSharp之旅(1) 加载网络页面
- sql语句的各种模糊查询语句
- python输入中文如何不带u
- 国际手机区号
- Advanced Fruits HDU
- 线性表的链式实现应用----学生信息管理系统
- Qt 通过绘画设置边框阴影
- 操作系统