深入理解 RxJava2:前世今生(1)

深入理解 RxJava2:前世今生(1)
最新回答
守护在此方

2022-10-22 18:07:23

RxJava最早是由Netflix基于微软的Rx.Net在Java上实现的一套相似的库,最初版本在社区内部迭代开发,API尚未稳定,随着时间的推移,逐步完善了如Observable、Publisher、Subscriber、Scheduler等接口以及大量操作符。

在开发RxJava早期版本的过程中,开发团队参与制定了Reactive Streams规范。然而,RxJava 1并未遵循此规范,原因包括考虑到一些特定因素。最终,RxJava开发组决定在2.0版本中正式支持Reactive Streams规范,而1.x版本中实现类似机制,而非直接使用Reactive Streams的接口。

在0.20.0-RC1中,RxJava第一次引入了Backpressure的概念,这一变化使得库变得既令人爱又令人恨。实际上,RxJava开发组曾在早期版本中在Observable中混入Backpressure,这是一个重大失误。正确的做法应该是将模块分为支持Backpressure和不支持的两类。在io.reactivex.Observable中彻底移除了Backpressure,而io.reactivex.Flowable则遵循Reactive Streams规范支持Backpressure。

经过两年多的迭代,RxJava在2014年9月发布了1.0.0正式版,这个版本类似于Reactive Streams版本,但不依赖其接口。与0.x版本相比,进行了相应的更改,如依赖方式拆分项目,新增和废弃了部分操作符,修复了大量BUG。

RxJava 2.0.0于2016年9月底正式发布。RxJava 2遵循Reactive Streams规范,其冷数据源真正实现的类型是Flowable,而热数据源的实现则在io.reactivex.processors包中。同时,RxJava 2将Observable中的旧Backpressure彻底移除,因此使用Observable时将不再抛出MissingBackpressureException。

在RxJava 2中,Flowable和Observable虽然实现代码复用了一部分,但机制大相径庭。数据源的三种模型分别是:Observable(消费者无权提出要求,数据由生产者提供)、Flowable(消费者通过Subscription主动提出需求数量,上游据此发射数据,导致生产和消费之间的矛盾)以及Subject/Processor(对应异步拉的数据源,也是热数据源)。使用Processor稍有不慎就会出错,但在实际使用中,Flowable.subscribe()时内置的Subscriber通常会在onSubscribe时直接向生产者request(Long.MAX_VALUE),表示无限流。

选择使用Observable还是Flowable取决于实际需求和场景。官方也有提示如何选择。关于RxJava 2的拆分,社区曾讨论过是否将其拆分为多个库,但最终决定保留。如果您是Android开发者,正纠结于RxJava带来的好处和体积问题,通过正确配置Proguard,对包体积大小的影响微乎其微。RxJava为Android开发者而生,能够大幅提升工作效率,前提是具备一些函数式编程的思维。欢迎关注公众号,有问题可后台留言。