RxJava从2015年问世,2016到2017开始流行,在2018到2019左右达到顶峰,几乎无人不会RxJava,无项目不用RxJava。这期间项目本身也在迭代,从1.0版本,到2.0版本,行业内流行最广的,用的人最多的,项目使用也最多的仍是2.0版本。时过境迁,现在虽然RxJava是一个项目的标配,但是现在它的受关注度,没有前几年高了,但仍有必要研究一下它的最新版本RxJava 3。
RxJava的前世今生
RxJava从诞生致今一共有三个大版本,区别都比较明显。最初是RxJava 1.0版本,它的特点是异步和数据流,核心思想仍是这些,但其它与Reactive Extensions基本上是同步在迭代的,因此RxJava 1并不是完全符合Reactive Extensions规范的,并且它是基于Java 6.0语言的,对一些新的Java特性的支持并不好。
后来Rx编程范式渐渐流行起来,以及Java语言本身的发现,所以就有了RxJava 2.0,它是Reactive Extensions的一个标准实现,也就是说从RxJava 2.0开始,是完全符合Rx规范的。RxJava 2.0版本并不是基于1.0版本的迭代,而是完全重写的,基于Rx规范从新实现的。对一些东西如函数的定义,以及像方法的名字都进行了规范化。这也是流行最广泛的一个版本,坊间绝大多数资料都是基于RxJava 2的,很多其他三方的开源库,如RxAndroid等也都基于此。
RxJava 2.0版本有单独的groudId是io.reactivex.rxjava2,可以用以区分。
RxJava 3.0
技术仍在不断的演进,RxJava最新的版本是3.0,它是基于2.0的迭代,并没有像1.0到2.0那样完全重写。主要的变化 是更加符合Rx规范,性能进一步的提高。1.0和2.0都已停止维护了。它也有单独的groudId是io.reactivex.rxjava3,可以与2.0进行区分。
包结构变化
代码层面的包名是有明显变化的,对代码进行了更好的组织。1.0和2.0都是在io.reactivex,到了3.0组件都有了单独的package。
Component | RxJava 2 | RxJava 3 |
---|---|---|
Core | io.reactivex | io.reactivex.rxjava3.core |
Annotations | io.reactivex.annotations | io.reactivex.rxjava3.annotations |
Disposables | io.reactivex.disposables | io.reactivex.rxjava3.disposables |
Exceptions | io.reactivex.exceptions | io.reactivex.rxjava3.exceptions |
Functions | io.reactivex.functions | io.reactivex.rxjava3.functions |
Flowables | io.reactivex.flowables | io.reactivex.rxjava3.flowables |
Observables | io.reactivex.observables | io.reactivex.rxjava3.observables |
Subjects | io.reactivex.subjects | io.reactivex.rxjava3.subjects |
Processors | io.reactivex.processors | io.reactivex.rxjava3.processors |
Observers | io.reactivex.observers | io.reactivex.rxjava3.observers |
Subscribers | io.reactivex.subscribers | io.reactivex.rxjava3.subscribers |
Parallel | io.reactivex.parallel | io.reactivex.rxjava3.parallel |
Internal | io.reactivex.internal | io.reactivex.rxjava3.internal |
使用起来更加的清晰和规范,并且不与老版本有冲突。
与Java 8更好的融合
另外一个重大改进就是与新版本的Java,即Java 8有了更好的融合,支持了好多Java 8中的数据类型。比如Optional和Stream:
- Observable.fromOptional()
- Observable.fromStream
- Observable.mapOptional
- Observable.blockingStream
- Observable.flatMapStream
行为变化
因为RxJava 2.0是符合Rx规范的,所以大部分功能和核心概念在3.0上面是没有变化的。只有在一些高级的概念上面有一些差别,比如错误处理有加强,以前在2.0时有些error会丢失,并且不会被处理,3.0上加强了error的流动,保证它能到达Subscriber。
另外一个重要变化 就是在multicast,也即针对Hot Observables的共享问题,多了一个reset方法,以让所有Subscriber都接收到同样的数据。
还有就是Flowable有了pause的功能。
三方库的兼容
还要注意三方库如Retrofit adapter,RxAndroid以及RxBinding等也是与RxJava的版本绑定的,要注意它们之间版本的匹配。
升级建议
因为RxJava 1并不完全符合Rx规范,所以如果还在用RxJava 1,那么是要立即升级到3.0。
因为RxJava 2.0是最流行的版本,所以现在大部分项目使用的应该是RxJava 2.0。那么就要看项目本身的情况,如果RxJava 2.0能完全满足项目的需要,没有用到太多高级的特性(如multicast或者Flowable),而且项目中重点引用RxJava的部分也基本上成成熟了,此种情况下,其实不建议升级到3.0,因为不会带来多少收益。
相反,如果使用了大量的高级特性,甚至还遇到了RxJava本身导致的问题,并且项目中还在大量使用RxJava,未来新功能的开发也会使用RxJava,那么还是尽早升级为妙。同时要注意,RxJava是一个流行的库,有很多三方库的依赖于它,版本一旦变动,会引发链式反应,要注意版本的匹配,以免发生不兼容的情况。
可以到这里找到最新的版本。