RxJava&RxAndroid学习之路–理论篇

最近一段时间以来,在面试的Android开发人员简历中,基本都会提及熟悉RxJava或RxAndroid,貌似不会RxJava或RxAndroid就落伍,就只是初级的Android开发人员。于是,带着好奇心和疑问准备一探究竟,于是乎接下来就是一通google balabala…但是,网上关于RxJava或RxAndroid的学习资料非常多,各种文章和blog让人眼花缭乱,不知道如何入手,可以说,大部分文章要么艰涩难懂,要么过于浅显,让人看了不明觉厉。是的,RxJava或RxAndroid的学习相对来说有一定的门槛,但是一旦入门,那么相信你就会爱上它。本文根据个人学习RxJava或RxAndroid的历程,总结出相关经验,以便他人学习之时少走弯路。

引言

学习一个新知识的时候,一般地,我们都会带着如下几个问题:

  1. 为什么要学习(Why to learn)?
  2. 要学的新知识是什么(What is it)?
  3. 怎么学习这个知识点(How to learn)?
  4. 学习之后怎么用(Where to use)?

第一个问题,这里就不用回答了,既然你打开了这篇文章,说明你肯定有着充分的理由。本文重点介绍一下2和3,也即本人学习RxJava或RxAndroid的经验总结,希望能对你有所帮助。

ReactiveX是什么?

要了解RxJava&RxAndroid是什么,首先得了解什么是ReactiveX?ReactiveX是Reactive Extensions的缩写,一般简写为Rx,RxJava&RxAndroid是Rx在JVM和Android平台上的具体实现,除了Java语言,ReactiveX几乎已经被其他主流编程语言所支持。其官方网址为http://reactivex.io,其实这个网站的手册和介绍已经非常详细,但是,对于初学者而言,还是有一定难度。不过,引用该网站对Rx的介绍作为一个概念性的认识,还是有必要的。

正如reactivex.io所述:

ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming

也就是说ReactiveX结合了观察者模式、迭代器模式和函数式编程的最佳思想。

因此,首先就需要熟悉观察者模式(Observer pattern),相信熟悉java和Android的朋友应该对此比较熟悉了,其在GUI编程中经常使用。要了解观察者,建议阅读维基百科上面的阐述:https://en.wikipedia.org/wiki/Observer_pattern;或者阅读”The Gang of Four”(所谓”四人帮”)所著的著名著作”Design Patterns:Elements of Reusable Object-Oriented Software”一书;亦可参考Github开源库https://github.com/iluwatar/java-design-patterns

同理,也需要了解迭代器模式(Iterator pattern),其在Java集合的遍历实现中经常使用。建议阅读维基百科上面的阐述:https://en.wikipedia.org/wiki/Iterator_pattern;或者阅读”The Gang of Four”(所谓”四人帮”)所著的著名著作”Design Patterns:Elements of Reusable Object-Oriented Software”一书;亦可参考Github开源库https://github.com/iluwatar/java-design-patterns

而关于函数式编程(functional programming,一种编程范式–programming paradigm),这个话题很大,也很深,水平有限,这里不做阐述,想了解的读者可以在维基百科https://en.wikipedia.org/wiki/Functional_programming查询或者通过其他资料学习。其实在我看来,在这个特定场景下,仅仅理解成用流式(链式)方式编写代码即可。

有背景有了大致的了解之后,笔者认为,那么接下来应该需要先弄清里面的术语,Rx里面术语比较多,要厘清每个术语对应的角色,才能真正入门(笔者在刚接触Rx的时候,被里面各种术语和角色弄得头晕)。真正弄透了各个角色,也就真正了解了Rx。

Rx里面的术语和角色

Rx里面包括很多术语,每个术语对应不同的角色,而这些角色组合在一起便是Rx的体系,也是我们在实际使用Rx进行编码的时候操作的对象。

  • Observable: 可观察对象,从对比角度看,相当于观察者模式中是被观察的对象(即观察者模式中的Subject,注意,请区分Rx里面的Subject,见下文),一旦数据产生或发生变化,会通过某种方式通知观察者或订阅者。Observable的强大之处,在Rx中定义为更强大的Iterable,即可以emit(发射)item和item序列(流),特别是数据流的概念,因为几乎所有的对象都可以理解或者转换成数据流,详细内容可参见http://reactivex.io/documentation/observable.html
  • items: 直译为项目,条目,在Rx里是指Observable发射的数据项;
  • emit: 直译为发射,发布,发出,含义是Observable在数据产生或变化时发送通知给Observer,调用Observer对应的方法;
  • Observer: 观察者对象,可以对比理解成观察者模式里面的Observer,监听(也叫订阅,Subscribe)Observable发射的数据(流)并做出响应,Subscriber是它的一个特殊实现。Observable和Observer之间通过Subscribe方法联系在一起;
  • Operators: 操作或运算,可以对Observable进行转换、过滤等操作,也可以生成Observable,大多数Operator对Observable操作返回的仍然是Observable,这样便可以形成链式操作(Chaining Operators),类似于构建者模式(Builder Pattern)。Rx真正强大之处,最关键之一就是Operators提供的能力。详细内容可参见http://reactivex.io/documentation/operators.html
  • Single: Observable的一个变种(variant),区别在于,它仅仅发出一个值(Value)或错误通知(error notification)。详细可参见http://reactivex.io/documentation/single.html
  • Subject: 在Rx的某些语言实现中出现,既是observer又是observable,详细信息可参见http://reactivex.io/documentation/subject.html
  • Scheduler: 调度者,Rx引入多线程的机制。默认情况下,Observable及Operators都是在同一个线程完成所有工作,Observable的SubscribeOn方法(其实也是一个Operator)改变了默认的行为,通过指定一个不同的Scheduler,Observable则在该Scheduler上执行操作。而ObserveOn方法(其实也是一个Operator)则指定一个不同的Scheduler,Observable用来发送通知给Observer。详细信息请参见http://reactivex.io/documentation/scheduler.html

RxJava&RxAndroid入门

对Rx有了初步的认识,特别是了解了里面的常用术语和角色,那么作为Java或Android开发者,要入门,应该怎么学习呢?首先,RxJava在Github上的仓库地址为https://github.com/ReactiveX/RxJava,RxAndroid的则对应https://github.com/ReactiveX/RxAndroid。在仓库的Wiki页面,有相关的介绍。不过不建议直接就读取里面内容,可以在有一定了解的基础上进行系统学习。

这里推荐一篇blog,http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/,里面分成4个部分,分别从基础、Operator、Rx的益处、RxAndroid四个方面进行了阐述,浅显易懂。

特别提醒:学习RxJava之时,可以用示意图的方式将流程的marble diagram图画出来,理解了marble diagram,也就很清晰地知道了整个机制

Eg.

除此之外,以下两篇文章或链接也值得一读:
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

http://www.introtorx.com/

进一步学习

通过上面几篇文章的介绍,就可以对RxJava有一个基本的了解,也可以简单运用了。要想全面深入学习RxJava,那么建议仔细阅读reactivex.io的全部内容,以及RxJava&RxAndroid在Github上仓库中的Wiki内容。这里面又包含了其他推荐文章的链接。同时也可以研究RxJava&RxAndroid的源码。

特别要提及的是,对于Android开发者而言,还需要了解Retrofit等支持Rx的开源库,结合起来使用,就更能彰显威力。那就是当下比较流行的Retrofit+RxAndroid开发。