前言
在实战 RxJava 之前,先谈谈我自己对 RxJava 的理解,我们知道 RxJava 是基于观察者模式的,我们可以把 RxJava 的使用看着整体的一条链:
- 在链的最上游:是生成、发送、或者发射事件的
Observable; - 在链的最下游:是根据上游的生成、发送、或者发射事件来做出相对应的动作的
Observer; - 在链的中游:作为中介的节点,变动上下游的性质,如线程的切换等;
我想,挺多的小伙伴可能在刚接触 RxJava 的时候,会感到疑惑:为什么是被观察者(Observable)订阅(subscribe)观察者(Observer),而不是观察者订阅被观察者?
我认为可以这么理解吧:首先你需要知道 Android 是基于事件驱动模型的,也就是说程序的执行流程是根据用户的动作(例如用户的屏幕触摸)触发的事件决定的。程序的执行流程在 RxJava 中就好比作观察者做出的动作,用户触发的事件就好比作被观察者产生的事件,程序的执行流程是代码固死的了,而用户的动作则是不确定的,程序代码根据用户操作执行相应的代码(如用户点击声量按钮只会调整音量,而不会让手机关机)。
然后为什么不是观察者订阅被观察者,其实这只是这样的写法更加符合事件驱动编程,先把观察者的代码加载进内存,以等待被观察者的到来后(如网络请求后的响应),执行对应的代码,因为,你永远不知道你的明天会怎样,唯一的只能先做好准备去面对。
创建操作符实践
# create()
1 | /** |
创建类型的 Observable#create() 可以自己作为事件的生产者,往下游发送事件;
在上游的
onComplete()或onError()方法执行完以后,再通过onNext()发送事件,下游不在接收上游的事件;上游已经发送了
onComplete()以后再发送onError(), RxJava 会报错;上游先发送
onError(), 然后再发送onComplete(),RxJava 不会报错,但下游不再接收onComplete()事件;
# just()
1 | /** |
创建型操作符 Observable#just() 在自己的内部发送事件,下游接收事件;
# fromArray()
1 | /** |
创建型操作符 Observable#fromArray() 在自己的内部发射事件,但发射的对象需要是数组类型,因为在阅读 Observable#fromArray() 的源码可以发现,Observable#fromArray() 接收的参数是可变类型参数:
1 | public static <T> Observable<T> fromArray( T... items) { |
# empty()
1 | /** |
创建型操作符 Observable#empty() 内部自己发送事件,下游默认是 Object,无法发出有值的事件,会发送 onComplete();
# range()
1 | private void learnRxRange() { |
创建型操作符 Observable#range() 会发送指定范围的 int 值的数值,如上面代码,开始为 10, 每次累加 1, 最后结果为: 10 11 12 13 14 的 5 个值。
Consumer和Observer
可能有的小伙伴可能分不清 Consumer 和 Observer 两个类,其实可以把 Consumer 看着 Observer 简版的观察者,也是根据上游被观察者的行为变化而变化。
