本文基于RxJava2.2.2。
基本概念
RxJava是Reactive Extensions的Java VM实现:一个用于通过使用可观察序列来编写异步和基于事件的程序的库。
Reactive Extensions:http://reactivex.io/intro.html
我的理解,Rx是一个标准,一个原则,RxJava则是一个这种标准原则在java上的应用库。
Cold Observable在每次被订阅的时候为每一个Subscriber单独发送可供使用的所有元素,而Hot Observable始终处于运行状态当中,在它运行的过程中,向它的订阅者发射元素(发送广播、事件),我们可以把Hot Observable比喻成一个电台,听众从某个时刻收听这个电台开始就可以听到此时播放的节目以及之后的节目,但是无法听到电台此前播放的节目,而Cold Observable就像音乐 CD ,人们购买 CD 的时间可能前后有差距,但是收听 CD 时都是从第一个曲目开始播放的。也就是说同一张 CD ,每个人收听到的内容都是一样的, 无论收听时间早或晚。(来自某篇译文)
RxJava1.x与RxJava2.x的不同:
由于RxJava1.x没有很好的遵守Reactive-Streams约定,RxJava2.x已经重写,RxJava1.x也已经不再维护。
RxJava2.x不再允许null,会抛出空指针异常
RxJava2.x新增了Flowable来更好的支持背压
Single的消费类从SingleSubscriber(抽象类)变成了SingleObserver(接口),处理1个数据,只有onSuccess和onError
Completable的消费类从CompletableSubscriber(接口)变成了CompletableObserver(接口),只是命名风格的统一,不发射数据,只有onComplete和onError
Maybe,新增基类,Single和Completable的整合,最多可以发射1个元素,所以该Maybe类型没有背压概念
Subject不再支持T -> R 的转换,支持背压的相应实现FlowableProcessor,接口org.reactivestreams.Processor
TestSubject移除,Schedulers.test()移除,Schedulers.immediate()移除
SerializedSubject不再是公共类,必须使用Subject.toSerialized() 和 FlowableProcessor.toSerialized() 代替。
ConnectableObservable变成ConnectableObservable和ConnectableFlowable
GroupedObservable变成GroupedObservable和GroupedFlowable,RxJava1.x中使用GroupedObservable.from()获取实例,现在类是抽象的,需要自己扩展,实现subscribeActual方法。
RxJava2.x不再需要开发者手动try-catch
Rx针对1.6,所以不能使用1.8定义的各种功能接口,RxJava2.x自己定义了一套功能接口。
RxJava1.x中的Action1到ActionN在RxJava2.x中都已经移除。
RxJava1.x Action0代替方案RxJava2.x Action,Runnable
RxJava1.x Action1代替方案RxJava2.x Consumer
RxJava1.x Action2代替方案RxJava2.x BiConsumer
RxJava1.x ActionN代替方案RxJava2.x Consumer<Object[]>
常用类
被观察者 | 观察者 | 订阅接口 | 不同 |
---|---|---|---|
Observable | Observer | ObservableSource | 上游多个数据,无背压 |
Flowable | Subscriber | Publisher | 上游多个数据,有背压 |
Single | SingleObserver | SingleSource | 只有一个事件或错误, |
Completable | CompletableObserver | CompletableSource | 没有事件,只发送完成或错误信号 |
Maybe | MaybeObserver | MaybeSource | Single与Completable的合 |
他们之间可以互相转化:
Flowable | Observable | Single | Maybe | Completable | |
---|---|---|---|---|---|
Flowable | toObservable | first firstOrError single singleOrError last lastOrError | firstElement singleElement lastElement | ignoreElements | |
Observable | toFlowable | first firstOrError single singleOrError last lastOrError | firstElement singleElement lastElement | ignoreElements | |
Single | toFlowable | toObservable | toMaybe | toCompletable | |
Maybe | toFlowable | toObservable | toSingle | ignoreElement | |
Completable | toFlowable | toObservable | toSingle | toMaybe |
常用类 | 职责 |
---|---|
Disposable | 用于取消订阅,可以在基类里使用CompositeDisposable.add/clear清空订阅,避免内存泄漏,clear()会循环调用每个对象的dispose方法,这个方法只是起到通知的作用,具体处理结果取决于任务自身 |
Subscription | 用于背压情况请求上游数据或取消订阅 |
Subject | 既可以做观察者,也可以做被观察者(下面xxxSubject都是这哥们的子类) |
PublishSubject | 不改变事件顺序,收不到订阅之前发送的事件 |
AsyncSubject | 无论何时订阅,发送多少事件,只能收到最后一个事件 |
BehaviorSubject | 发送订阅前一次事件和订阅之后所有的事件 |
ReplaySubject | 无论何时订阅,接收所有事件 |
UnicastSubject | 只能订阅一次 |
SerializedSubject | 线程安全的Subject,非公共类,需要使用Subject.toSerialized()转化 |
Processor | 相对于Subject的背压支持(下面xxxProcessor都是这哥们的子类) |
AsyncProcessor | 不论何时订阅,都只发射最后一个数据,如果因为异常而终止,不会释放任何数据,但是会向 Observer 传递一个异常通知。 |
BehaviorProcessor | 发射订阅之前的一个数据和订阅之后的全部数据。如果订阅之前没有值,可以使用默认值。 |
PublishProcessor | 从哪里订阅就从哪里发射数据。 |
ReplayProcessor | 无论何时订阅,都发射所有的数据。 |
UnicastProcessor | 只能有一个观察者。 |
SerializedProcessor | 其它 Processor 不要在多线程上发射数据,如果确实要在多线程上使用,用这个 Processor 封装,可以保证在一个时刻只在一个线程上执行。 |
MulticastProcessor | 指定事件大小,默认bufferSize是128 |
线程
RxJava不能直接使用Threads或ExecutorServices,而是使用Scheduler来处理线程。Schedulers帮助类提供了几个默认实现:
- Schedulers.computation():处理密集计算操作
- Schedulers.io():阻塞或者I/O操作
- Schedulers.single():有序的以FIFO方式在单个线程上运行
- Schedulers.trampoline():在其中一个参与线程中以顺序和FIFO方式运行,通常用于测试目的。
另外还可以使用Scheduler.from()指定线程池。在android平台上,RxAndroid也有相应支持: - AndroidSchedulers.mainThread():主线程
- AndroidSchedulers.from(Looper looper):指定线程
RxJava使用observeOn和subscribeOn操作符切换线程。具体分析浅析RxJava2线程切换