RxJava是一种响应式的编程方式,一种对观察者模式的拓展,可以将对数据的操作转换为流式的操作,使得逻辑关系更简单,提高代码可读性和增强解耦性。本文需要了解Java的观察者模式作为学习前提。
RxJava来源
- 响应式编程的一个关键概念是事件。事件可以被等待,可以触发过程,也可以触发其它事件。事件是唯一的以合适的方式将我们的现实世界映射到我们的软件中。
- Netflix在2012年开始意识到他们的架构要满足他们庞大的用户群体已经变得步履维艰。因此他们决定重新设计架构来减少REST调用的次数。取代几十次的REST调用,而是让客户端自己处理需要的数据,他们决定基于客户端需求创建一个专门优化过的REST调用。为了实现这一目标,他们决定尝试响应式,开始将.NET Rx迁移到JVM上面。他们不想只基于Java语言;而是整个JVM,从而有可能为市场上的每一种基于JVM的语言:如Java、Clojure、Groovy、Scala等等提供一种新的工具。
2013年二月份,Ben Christensen 和 Jafar Husain发在Netflix技术博客的一篇文章第一次向世界展示了RxJava[1]
RxJava是什么
放上github 上的地址:https://github.com/ReactiveX/RxJava
定义:RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
理解:这是一种基于JVM的扩展库,主要通过观察者模式来处理响应式的异步问题。RxJava特点:[2]
- 并发从而更好的利用服务器的能力。
- 有条件的异步执行。
- 更好的方式来避免回调地狱。
- 响应式方法
- 可以自由的切换执行任务的线程
观察者模式的拓展:
- 生产者在没有更多数据可用时能够发出信号通知:onCompleted()事件。
- 生产者在发生错误时能够发出信号通知:onError()事件。
- RxJava Observables 能够组合而不是嵌套,从而避免开发者陷入回调地狱
API的使用
5.1 要写一个HelloWorld例子,先创建一个Observable对象:
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);
调用Observable.create()方法,new一个observable.OnSubsceibe作为参数。在覆写的call方法里面,做常规观察者模式里面的调用观察者中的方法(通知),这里就是调用观察者中的onNext()表示将消息发送出去,onCompleted()表示消息正常发送完成,后面再没有消息。
5.2 再来创建一个观察者:
我们可以看到观察者是以String作为输入参数,而内部用覆写onCompleted()、onError()和onNext()的方式来表示如果输入的数据顺利完成、出现错误和正常接受时候分别对应的处理操作。这里仅仅是打印log和输出传进来的参数,比较简单。
5.3建立两者之间的联系:
myObservable.subscribe(guanchazhe);
这个就和常规的观察者模式类似,需要订阅,值得说明的是,一旦这个订阅的关系产生了,观察者就会开始接受信息。
到这里,常规的观察者模式里面具有的东西已经介绍好了,接下来,我们说一些RxJava的独特性
6.RxJava的创新:
6.1 在观察者方面(Observer方面)产生的Subscriber是Observer的子类
* 增加了onStart()。这个方法在观察者和被观察者建立订阅关系后,而被观察者向观察者发送消息前调用,主要用于做一些初始化工作,如数据的清零或重置。
* 增加了unsubscribe()。这个方法用于取消订阅,若isUnsubscribed()为true,则观察者不能收到被观察者的消息。
6.2在被观察者方面(Observable)
除了常规的Observable.create(Observable.OnSubscribe)这种方法创建以外,还有:
* Observable.just(T…),比如:
Observable beiguanchazhe = Observable.just("message1","message2","mes3"...)
这样建立的被观察者是将里面的N个参数(也可以是一个)打包一起发出去,从效果上来说等同于每次消息都去调用onNext()+最后一次调用onCompleted()
* Observable.from(T[]), Observable.from(Iterable<? extends T>)
使用时:
他传入的参数是一个集合,经过from之后,将会依次把集合中的元素拆分再发出去。
下一次我们在来学习RxJava中的变换作用的操作符
参考:
[1]https://rxjava.yuxingxin.com/chapter1/landing_in_the_java_world_-_netflix_rxjava.html
[2]https://rxjava.yuxingxin.com/chapter1/landing_in_the_java_world_-_netflix_rxjava.html
[3]http://mouxuejie.com/blog/2016-03-27/rxjava-basis/
[4]http://gank.io/post/560e15be2dca930e00da1083
[5]http://blog.csdn.net/lzyzsd/article/details/41833541
[6]ReactiveX文档中文翻译
[7]RxJava官网