前言
在实战 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
简版的观察者,也是根据上游被观察者的行为变化而变化。