大家都清楚,Rxjava的问世给我们程序员带来了一大波福利,简单的链式调用就能实现比较复杂的功能,并且逻辑清晰,易于扩展。但是,对于它的学习,还是需要一定的时间成本的。其实它的设计模式主要就是观察者模式,只不过它不是标准版的观察者,它的一个被观察者(Observable)只能对应一个观察者(Observer),并且通过subscribe进行订阅观察者。,下面带大家学习,常用的Rxjava2操作符。
一、创建型操作符
1、create操作符
测试代码如下:
运行结果如下:
总结:
- 上游被观察者首先订阅下游观察者,调用onSubscribe()方法
- 订阅完成后,上游被观察者通过发射器ObservableEmitter进行发射数据到下游
- 下游观察者接收到数据,调用onNext()方法
- 上游被观察者调用emitter.onComplete()方法,表示发射完毕,此时下游不会再接收到数据。下游此时会调用onComplete()方法
- 下游调用完毕onComplete()方法后,才会继续执行上游的后续日志打印。
2、just操作符
测试代码如下:
运行结果如下:
总结:
- 这里并没有调用发射器进行发射数据,那是在just内部会自动发射数据。
- 上游发射完毕后,会自动触发下游onComplete()方法。
3、fromArray操作符
测试代码如下:
运行结果如下:
和just操作符类似,只是发射的数据类型为数组类型。
4、empty操作符
测试代码如下:
运行结果如下:
总结:
- 传递的数据类型只能为Object类型。
- 下游onNext()方法不会执行。
- 下游会触发onComplete()方法。
5、range操作符
测试代码如下:
运行结果如下:
总结:
- 这里并没有调用发射器进行发射数据,那是在range内部会自动发射数据。
- 上游发射完毕后,会自动触发下游onComplete()方法。
- range参数:第一个参数为起始数字,第二个参数为从起始位置开始,发送count个数,每次加1。
6、interval操作符
测试代码如下:
运行结果如下:
不难发现,每隔1s钟就会执行下游的onNext()方法,即使我们把activity销毁掉,上游仍然会往下游发送数据,所以使用该操作符需要考虑内存泄漏的问题。
二、变换型操作符
1、map操作符
测试代码如下:
运行结果如下:
最后打印的是bitmap类型。
总结:
- 上游被观察者可以通过map操作符多次转换
- 下游接收的数据以最后一次map转换作为最终数据
2、flatMap操作符
测试代码如下:
运行结果如下:
总结:
- 下游接收的数据是没有顺序的,说以flatMap是无序的。
- flatMap需要重新发射新的数据。(ObservableSource是Observable的父类)
3、concatMap操作符
测试代码如下:
运行结果如下:
总结:
- 下游接收的数据是有顺序的,说以concatMap是有序的。
- concatMap需要重新发射新的数据。
4、groupBy操作符
测试代码如下:
运行结果如下:
总结:
- 通过该操作符能够对数据进行分组发送,例子中发送两组
- 如果需要拿到每一组具体的内容,可对GroupedObservable进行重新订阅
5、buffer操作符
测试代码如下:
运行结果如下:
观察发现,每10个数据发射一次,并且下游接收的是list集合类型。
总结:
- 下游接收数据类型为list集合类型
- 每次发送的集合大小为缓存大小