RxJava函数式编程是一种编程范式。响应式编程是一种面向数据流和变化传播的编程范式,数据更新是相关联的。函数响应式编程可以极大地简化项目,特别是处理嵌套回调的异步事件,复杂的列表过滤和变换或者时间相关问题。
Rx是函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编译异步和基于事件的程序。
RxJava与观察者模式
RxJava的异步操作是通过扩展的观察者模式来实现的,RxJava有4个角色Observable、Observer、Subscriber、Suject。
RxJava基本实现在使用RxJava前请先在Android Studio 中配置gradle:
1.创建Observer(观察者)它决定事件触发的时候将有怎样的行为,代码如下所示:
其中onCompleted、onError和onNext是必须要实现的方法,其含义如下。
•onCompleted:事件队列完结。RxJava不仅把每个事件单独处理,其还会把它们看作一个队列。当不会再有新的 onNext发出时,需要触发 onCompleted()方法作为完成标志。
•onError:事件队列异常。在事件处理过程中出现异常时,onError()会被触发,同时队列自动终止,不允许再有事件发出。
•onNext:普通的事件。将要处理的事件添加到事件队列中。
•onStart:它会在事件还未发送之前被调用,可以用于做一些准备工作。例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。
当然,如果要实现简单的功能,也可以用到Observer来创建观察者。Observer是一个接口,而上面用到的 Subscriber 是在Observer 的基础上进行了扩展。在后文的 Subscribe 订阅过程中Observer也会先被转换为Subscriber来使用。用Observer创建观察者,如下所示:
创建 Observable(被观察者)
它决定什么时候触发事件以及触发怎样的事件。RxJava 使用create 方法来创建一个Observable,并为它定义事件触发规则,如下所示:
通过调用Subscriber的方法,不断地将事件添加到任务队列中。也可用just方法来实现:Observable observable=Observable.just("杨影枫","月眉儿");上述代码会依次调用onNext("杨影枫")、onNext("月眉儿")、onCompleted()。还可以用from方法来实现,如下所示:
RxJava的Subject
Subject 既可以是一个 Observer 也可以是一个Observerable,它是连接 Observer 和Observerable的桥梁。因此,Subject可以被理解为Subject=Observable+Observer。RxJava提供了以下4种Subject。
1.PublishSubjectPublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一创建完成就立刻开始发射数据,因此这里会有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来自原始Observable的所有数据都被分发,则可以当所有观察者都已经订阅时才开始发射数据,或者改用ReplaySubject。
2.BehaviorSubject当Observer订阅BehaviorSubject时,它开始发射原始Observable最近发射的数据。如果此时还没有收到任何数据,它会发射一个默认值,然后继续发射其他任何来自原始Observable的数据。如果原始的Observable因为发生了一个错误而终止,BehaviorSubject将不会发射任何数据,但是会向Observer传递一个异常通知。
3.ReplaySubject不管Observer何时订阅ReplaySubject,ReplaySubject均会发射所有来自原始Observable的数据给Observer。有不同类型的ReplaySubject,它们用于限定Replay的范围,例如设定Buffer的具体大小,或者设定具体的时间范围。如果使用ReplaySubject作为Observer,注意不要在多个线程中调用onNext、onComplete和onError方法。这可能会导致顺序错乱,并且违反了Observer规则。
4.AsyncSubject当Observable完成时,AsyncSubject只会发射来自原始Observable的最后一个数据。如果原始的 Observable 因为发生了错误而终止,AsyncSubject 将不会发射任何数据,但是会向Observer传递一个异常通知。