RxJava
RxJava和Rx的历史
作为一个开发者,我们经常会训练思考反直觉的方式,用代码模块化我们的世界并不会简化挑战,就在不久前,面向对象程序还被认为是解决这个问题的良方,制造我们与真实世界交互的蓝图,是革命性的想法,而且如类,对象这些核心概念还一直影响着我们的代码世界。但是商业和我们需求在不断变得复杂。到2010时,大家清晰地认识到,面向对象程序只能解决部分问题,类,和对象在代表方法和属性方面,表现很好,但当他们需要和其他类进行交互时,他们以日益增加的复杂度方式变得异常繁重。然后就出现了rx来解决这个问题,随后出现了很多带有rx思想的扩展库,rxJava就是其中之一。
其核心思想就是,事件即是数据,数据就是事件
对Rx的思考
先抛开你对java知识的了解。让我们先观察下我们的世界。这些听上去都是些平淡无奇的状态,但作为开发者,我们很容易监视他们。
我们注意到这样一个事实,那就是世界所有的物体都是运动的。交通,天气,人们,会话,金融,交易,等等所有的都在运动。技术上的,甚至于稳固如岩石都在运动,因为地球的公转和自转。如果你考虑这样一种可能,所有的事情都可以模块到运动中来,作为开发者,这将是压倒性的。
另一个观察就是,很多不同的事件是同时发生的。许多活动在同时刻发生,但有时却单独运行,而有时,他们能够覆盖某些点来进行交互,一辆汽车开动时并不会影响一个人的慢跑,他们是两个不同的流事件,但在某种情况下,汽车会停下来来避让慢跑者,如果我们世界都是这样,为什么我们不用这种方式构建代码模型呢。为什么我们不用代码进行多并发事件流,发生在同一时间的数据,对于开发者来说,通常不会花很多时间在对象的状态,或者做一些必要的或连续的行为,你也许会在你的代码中执行p1,p2然后再执行p3,而p3是依赖p1,p2的,那为什么不同时启动p1,p2,然后等这两个程序都完成才执行p3呢,当然你可以使用回调和java并发工具,但是rxJava 使用起来更容易,更安全。
最后一个观察,一本书或cd是静态的,一本书是不变的一系列文字,而CD是磁道的结合。他们都不是动态的。然后,当我们读一本书的时候,我们一次只读一个词,这些字本高效地动态放进像文字流中,被我们的眼睛说消耗掉,同样CD也是如此,磁道像声波一样运动着,而你的耳朵消耗每个磁道。实际上,静态的东西也是可以放入运动中的,这很抽象但却是强有力的想法,因为我们让每一个静态的item变成一系列的事件。
当我们瞄准使用数据和事件的字段,通过把他们两个视为一样的东西,那我们就解开了方法编程的力量,解锁了以前你认为没有必要的能力,在响应式编程的背后有这样一个基本思想,事件即数据,数据即事件,这也许很抽象,当你考虑我们的真实世界的时候,你不需要太长时间就可以理解。跑步的人和汽车都有属性和状态,但是他们都在运动中。当他们消费的时候,书籍和CD都是放在运动中,将事件和数据进行合并成一个,允许code感觉我们的世界的有机性和代表性。
为什么我们要学习RxJava
Rx 和RxJava 勾勒出广泛对抗每天所面临的程序问题,允许你表达商业逻辑并花费较少的时间来写代码,你曾经和并发,事件处理,废弃的数据状态,异常恢复进行过抗争吗?怎么使你的代码可维护,能重用,可发展而且还能跟上业务的发展。也许说把响应式编程看做是这类问题的良方有点武断,当可以肯定的是,这是一次飞跃,也有不断增加的用户需求来使应用实时和响应,响应程序允许你快速分析和用实时数据进行工作,比如twiter 反馈或是股票价格,他也可以取消或重定向,规模化并发,复制快速发出的数据。像流一样组装数据和事件,可以进行混淆,合并,过滤,分离,变形,开放根本的有效的方式组建和发展code,总的来说,响应式编程,使很多棘手的事情变得容易,能使添加值以你认为不可能的方式变得容易,如果你有程序用响应程序写,你会发现你的部分代码需要跑在不同的线程上,这种情况你几秒就可以解决这个问题,如果发现网络连接问题间歇性地发生奔溃,你可以优雅地使用恢复策略,等待并重新开始,如果你需要在程序之间插入一个操作,那也很简单。响应式编程已经突破模块链可以被添加或是移除,这些都可以很快战胜以上提及的所有问题,本质上,RxJava 允许应用策略或可发展来维护在生产中的稳定性。
在这本书中我们能学到什么
就像前面所说的,RxJava是java的响应接口,在这本书中,我们将会聚焦RxJava2.0 ,但是我们会提及1.0的巨大不同,我们将优先学习思考响应式编程,并利用rxjava 的实际特性,开始高水平的知识之前,我们将会着步深入了解RxJava是怎么工作, 沿用这个思路,我们将会学习到响应式模式和技巧来解决平常编程所遇见的问题。
RxJava的环境设置
现在RxJava 有两个版本1.0和2.0 。等会将会指出两个版本之间的主要不同,并讨论你应该使用哪一个版本。
RxJava 2.0是非常轻量级的库大概2M 大小,这就使得用android或其他项目时,就有一个较小的依赖开销,RxJava 2.0 只有一个依赖叫Reactive Streams ,这是一个核心库,它为异步流设置标准。
而RxJava 1.0 是并没有依赖,但是他在标准化java平台的响应编程做出关键的努力
如果你重头开始一个项目,尝试使用RxJava 2.0 ,这就是我们本书所有覆盖的,我将会指出1.0的巨大不同,当RxJava 1.0 将会很好地支持,因为无数的项目在使用它,RxJava 2.0 将会在创新的路上不断前行,而1.0将继续进行维护和bug的解决。
Maven Center 的RxJava 这里可以看看rxJava的最新版本,可以下载源码或是在android studio 中配置,怎么配置,大家肯定都已经熟悉了,这里就不赘述。
compile 'io.reactivex.rxjava2:rxjava:2.1.14'
什么时候使用RxJava
通常的一个问题是,在什么时候才用RxJava,这里有两个回答:
- 将所有的东西都看作是Observable是可取的,将项目中的所有东西都看成是数据和事件。当你这样做的时候,你将会很大程度地提升你的应用质量。
- 在什么地方,RxJava是不可取的,只有当Rx老手看见这个返回
- 返回list<String> 比Observable<String>更好,Rx新手不要担心,什么可以rx,什么不可以rx,随着时间的推移,我们可以看见rx的好处被边缘化的情况,只有我们非常有经验的时候,这样的事情才会发生。