稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

Upgrade to RxJava 3

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是一个流行的库,有很多三方库的依赖于它,版本一旦变动,会引发链式反应,要注意版本的匹配,以免发生不兼容的情况。

可以到这里找到最新的版本

参考资料

Comments