rxjava库非常的强大,他有两个核心的作用,一个是线程切换,另一个就是强大的映射功能。
他本身的设计采用的是观察者模式,通过事件的驱动来让我们的程序编写更加的简单。在写法上他的链式编程的风格使我们可以避免传统的接口回调带来的复杂的逻辑。所以,无论是在编程思想上还是语法上都是一个非常优秀的库。
rxjava库无论从使用上还是源码的实现上都是比较复杂的,在学习的时候一定要在多多使用的基础上,对其有一定的了解以后再去学习源码。
在使用上: rxjava有以下几个核心的概念需要我们掌握。1.被观察者observable, 这是整个程序的源头,通过提供的各种方法,我们可以快速的将一些数据等转化为一个Observable.创建好Observable是我们使用rxjava去实现功能的第一步。 2.操作符Operatior, 有了Observable这个被观察者以后,我们就可以通过rxjava提供的各种各样的操作符来对Observablek中的item进行各种各样的操作,以达到数据的转化并且能够满足我们的使用为止。操作符也是rxjava最核心的概念了。也是整个rxjava最灵活和复杂的地方。3.订阅者,也就是我们最终要消费事件的地方,是我们rxjava整个事件流程的终点。以上三点是我们rxjava库最最重要的三个概念,大家一定要掌握。4.线程切换,这个在android应用中用见的比较多,这个虽然不是整个事件链路上的必须,却也是十分重要的一个用法,有了方便的线程切换,我们可以不再自己去通过创建线程+回调去操作了,rxjava可以轻松的帮我们搞定线程的切换。所以使用rxjava去解决问题的过程就整个如下图:
以上四个核心概念中,Observalbe,Subscribe, 线程切换的创建和使用都是比较固定的,没有太大的变化,相对比较容易掌握,而最最灵活的就是这一系列的操作符,通过使用不同的操作符和操作符的结合使用,可以基本实现我们所有的需求。
第一大类操作符,叫转换操作符,用来将原Observable转化为其它类型的Observable.几个最常用的transform。
1.map,不改变obsevable,只将原obsevable中的item map为其它的item类型
2.flatmap,会改变observable,将原observable中的item转换为一个或者多个新的observable,转换完毕以后并将这些新的observable通过另一个操作符merge合并为一个。所以这个操作虽然中间可能产生非常多的临时observable,但最终还是一个。
3.contactmap,与flatmap作用基本一样,唯一不同的是flatmap在合并产生的observable是无序的,而contactmap是有序的。
4.toXXX类操作符,包括:toList, toMap,toArray等,会将Observable中的数据转化为对应的数据类型,例如:原Observable中有3项数据,如果不转换的话,subscribe会接收到3个事件,而转化为list后,则只会接收到一个事件。
当然还有一些其它的转换操作,但相对来说都不常见了。转换操作符是几类操作符中最复杂的了。因为他会涉及到对observable本身的一个transform.
第二大类操作符,过滤操作符,用来将原Observable中的item进行增删改,这类操作符相对来说就简单了,不会涉及到对observable的转换,只是对原observable中的item进行transform.
几个最常用的过滤操作符。
1.distinct 去重,将原obsevable中的重复数据过滤掉。
2.filter 这一类的核心方法,通过传入一个自定义返回值为boolean的方法来决定过滤那些item,是实际开发中最常用的。
3.take, first, last,skip等见名知义,不再多解释。
第三大类操作符:组合操作符,同我们第二类中讲到的完全不同,这个类型的操作符完全是对obsevable进行操作的,而不是observable中的item. 有以下几个开发中常见的。
1.merge 将多个指定的observable合并为一个,完全无序,有一点要注意的是,如果不同observable中的数据类型的不同的话,需要开发人员自行指定合并后的唯一的新observable中的数据类型。通常会上转型数据。
2.contact, 作用与merge一样,唯一不同是,会将指定的observable依次按照参数的顺序指定。
第四类操作符:计算类相关操作符,也会改变observable本身,但通常是改变原observable的数据类型。而不会像第一类中的那样产生新的observable.
1.count, average, max, min, sum等,例如: Observable<List> = Observable.from(List); 通过以下代码:Observable.from(List).sum();后会变成:Observable<Integer>
此类操作符使用起来也相对简单,不再细说。
综上所述,其实所有操作符又可以分为两大类。
一类是会改变Observable本身的,例如:flatmap, merge这种,他们重点会改变obsevable.
另一类就是只改变Observable中数据的,例如:map,filter等。
通过直接或结合使用这些强大的操作符,我们可以将原始的数据转换成任意我们需要的最终数据。以上是rxjava最复杂的操作符的一些学习总结,其它的关于Observable,Subscribe的创建和切程切换都比较简单,通过动手练习可快速掌握。
随着rxjava库越来越流行,使用的越来越广泛,以致于许多库为了兼容rxjava的编程思想和链式写法,也在自己的库中提供了主要是Observable这一概念。这样,在自己的库中有了Obsevable后,就可以和rxjava结合起来使用。能与rxjava结合使用的库我知道的主要由以下几个:
1.retrofit库,这个网络库底层都是由okhttp实现的,那为什么同一个团队又出一个相似的库呢,就是因为这个库可以结合rxjava使用,每个网络请示都可以返回一个Observable,从而开始我们整个rxjava的编程链路。
2.greenDao, 一个也很常用的移动端ORM数据库,为我们封装了了对底层sqlite的操作,可以让开发人员更注重与业务的实现。而他一大的特色就是可以任何一次对数据库的操作返回为一个Observable,这样我们就可以开始rxjava的编程链路。
3.rxbinding, 一个可以将任何android中的view都包装为Observable的库,可以让android开发人员都以rxjava式的编程来初始化view,为view添加事件等。
下图是这些库与rxjava的关系:
所以,rxjava发展和使用到现在,已经更像是一种编程思想和风格,而不仅仅是一个简单的工具库,所以还是值得大家好好去学习一下的。