1.RxJava来源
从github上我们可以看到RxJava是隶属于ReactiveX(Rx)仓库,Rx是从微软的函数响应式编程库(Reactive Extensions)发展而来的, 提供了一种新的组织和协调异步事件的方式。
官方对于该库的介绍是,
- An API for asynchronous programming with observable streams
- ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
ReactiveX提供可观测流的异步编程API,它的灵感来源于观察者模式、迭代器模式和函数编程这些优秀思想。
ReactiveX作为一个通用库, 现在已经有多种语言的实现版本(都是开源的), 包含RxJava, RxCpp, RxSwift, RxKotlin, RxGroovy, RxJavaScript等具体可参照所有支持语言
2.什么是RxJava
RxJava 是 ReactiveX 在 Java 上的开源的实现。
网上大多概况为它是一个实现了异步操作的库。这种概括来源于官方但是太过片面,它不仅仅异步一个功能,在使用中发现它对于数据流的各种处理非常方便。
下面是Github上RxJava库的官方简介。
RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
RXJava——JVM的响应性扩展——在Java VM上使用可观察序列(即ReactiveX中提到的可观测流)编写异步和基于事件的程序的库。
简而言之,就是在使用Java编程时,该库能使用观察者模式编写异步和基于事件的程序。
3.关键词解析
既然是学习就要搞清楚细节,所以对于这些平时听到的名词,还是值得我们基于极客和刨根问底的精神来细细品味的。
观察者模式
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。比如Java中的LinkedList内部实现是双向链表,比较复杂,这时候通过迭代器Iterator遍历元素就很简单,我们不必关注内部实现。
函数式编程
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
函数式编程中的函数,是指数学中的函数,即自变量的映射(一种东西和另一种东西之间的对应关系)。也就是说,一个函数的值仅决定于函数参数的值,不依赖其他状态。
响应式编程
简称RP(Reactive Programming)
在计算机领域,响应式编程是一个专注于数据流和变化传递的异步编程范式。这意味着可以使用编程语言很容易地表示静态(例如数组)或动态(例如事件发射器)数据流,并且在关联的执行模型中,存在着可推断的依赖关系,这个关系的存在有利于自动传播与数据流有关的更改。
简单概括,本质上是程序会对数据流或某种变化所作出相应的反应。
4.从基本使用RxJava分析
掘金翻译计划中看到的有关RxJava的介绍讲的很仔细,解决了很多困惑。还是从最基本的使用入手,下面是最基本的最简单的用法。
/****************创建被观察者******************/
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
//执行耗时操作
Thread.sleep(2000);
emitter.onNext("耗时操作完毕,发送可观测的对象");
}
})
/****************线程调度,被观察者在IO线程,观察者在主线程订阅******************/
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
/****************被观察者被观察者订阅******************/
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log(s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
我们从类名就能大概简单理解到整个代码的意思,创建一个被观察者Observable
,如果它被观察者Observer
订阅了,那么事件发射器ObservableEmitter
就会将事件推到每个观察者。其中ObservableOnSubscribe
在源码中的解释如下
/**
* A functional interface that has a {@code subscribe()} method that receives
* an instance of an {@link ObservableEmitter} instance that allows pushing
* events in a cancellation-safe manner.
*
* @param the value type pushed
*/
public interface ObservableOnSubscribe {
/**
* Called for each Observer that subscribes.
* @param emitter the safe emitter instance, never null
* @throws Exception on error
*/
void subscribe(@NonNull ObservableEmitter emitter) throws Exception;
}
它是一个拥有 subscribe
方法的功能性接口,能接收一个 ObservableEmitter
对象,该对象能安全的推送事件,并能以安全方式取消。
注意这里的 subscribe
方法的描述,每个订阅该事件的观察者都会调用这个方法,拥有这个发射器。
举个例子来说明,比如现在有很多学生订阅21世纪英语报,那么报社就相当于被观察者Observable
,我们相当于观察者Observer
,送报人就相当于这里的事件发射器ObservableEmitter
。我们想要看报纸不需要去询问报社什么时候有新的报纸,只需要订阅,如果有新的报纸,送报人就会给我们送来新的报纸。
5.Observable类
下面就Observable
这个类,结合ReactiveX中的关于Observable的解释和RxJava中的文档解释来分析一下这个类。
ReactiveX中的介绍:在ReactiveX中,观察者订阅一个被观察者。然后,观察者可对可观察到的项目或项目序列做出反应。这种模式有利于并发操作。因为它不会在等待被观察者发射对象时阻塞,而是以观察者的形式,随时准备对被观察者在未来的任何时间做出适当的反应。
下面这种图表示了在ReactiveX文档中被观察者是如何转换的,文档中会多次出现这样类似的图,对于我们理解很有帮助。
RxJava中的介绍:Observable是非背压的,它是一个提供工厂方法、中间操作符来同步或异步的处理数据流的基类。该类中的许多运算符接受ObservableSource(s)
,这是非背压流的基本接口,Observable本身也实现了这种接口。ObservableSource是可被观察者处理的非背压被观察者源基本接口。它里面的subscribe
方法是为了将观察者和被观察者联系起来,也就是产生订阅关系。
/**
* Represents a basic, non-backpressured {@link Observable} source base interface,
* consumable via an {@link Observer}.
*
* @param the element type
* @since 2.0
*/
public interface ObservableSource {
/**
* Subscribes the given Observer to this ObservableSource instance.
* @param observer the Observer, not null
* @throws NullPointerException if {@code observer} is null
*/
void subscribe(@NonNull Observer super T> observer);
}
6.各方法作用
create
方法在上面提到过就是创建被观察者,调用ObservableEmitter发射器的方法如下图,onNext
会以推的方式发送数据,onComplete
表示已经完成。
observeOn
方法就是对被观察者进行线程调度,让它在指定的线程发送。这里要注意的是,如果调度器真的是异步,那么在发送的线程中onError可能先于onNext执行,如果需要严格的事件顺序,请考虑使用 observeOn(Scheduler scheduler, boolean delayError)
重载。
subscribeOn
在指定线程异步订阅被观察者。订阅过程是异步的,结果是在指定线程接收。
Observer
就是观察者基类接口,其中的方法和发射器基类接口的方法基本一致,所以发送的数据会在onNext中接收到,onError、onComplete同理,唯一多了的方法就是onSubscribe
它会接收一个Disposable
对象,以便随时打断被观察者和观察者之间的联系。