转载请注明出处
作者:AboutJoke ( http://blog.csdn.net/u013200308 )
原文链接:http://blog.csdn.net/u013200308/article/details/53559707
初识
RxJava出来有一年多了吧,但貌似理解和使用的人不是很多的样子,我也是由于使用Retrofit才接触到。那么RxJava是什么呢?GitHub主页的介绍上写到:
RxJava is a Java VM implementation of Reactive Extensions: a libraryfor composing asynchronous and event-based programs by using observable sequences.
翻译过来就是:RxJava是Reactive Extensions的Java VM实现:用于通过使用可观察序列来编译异步和基于事件的程序的库。嗯,谷歌翻译的。虽然看起来有点生硬,但也能让我们大概的读懂意思。简单的概括来说就是:异步 ,想想我们使用过的AsyncTask,handler都是为了实现异步,可以说在我们日常开发中异步是一种必不可少的实现方式。那既然已经有了AsyncTask和handler,那为什么我们还要去学习和使用RxJava?而且看起来还很难懂得样子。首先作为一个程序员,要有时刻去学习新知识的动力,其次既然有很多人推崇,看看GitHub上1w+的star,就可想而知他肯定有自己的独到之处,至于是什么,就让我们一起在学习中来了解。
接触
首先放上RxJava的地址:https://github.com/ReactiveX/RxJava
RxAndroid:https://github.com/ReactiveX/RxAndroid
然后引入依赖:
compile ‘io.reactivex:rxjava:1.1.6’
compile ‘io.reactivex:rxandroid:1.2.1’
还有一个对于我们Android开发者来说比较重要的RxAndroid,这个库是对RxJava的扩展,可以让我们在Android开放中使用起来更加的方便,当然你也可以只使用RxJava。如果你还不知道如何依赖的话,得赶紧补补了。现在RxJava已经出2.0版本了,但由于我是在1.0+版本时期去学习和使用的,所以本篇博客也只以1.0+版本为例。2.0版本如果和1.0+版本相差较大,我后续也会对2.0版本推出博客。
好了,做好准备工作我们就来揭开RxJava的面纱吧。首先我们先看看RxJava的一般写法:
public void demo1() {
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
L.e(s);
}
@Override
public void onCompleted() {
L.e("success");
}
@Override
public void onError(Throwable e) {
}
};
myObservable.subscribe(mySubscriber);
}
RxJava主要由Observable(被观察者),Subscriber(观察者,订阅)来组成。我们可以用一个很简单的例子来解释一下,开关和灯。Subscriber是灯,Observable是开关,他们通过电线连接在一起。当开关打开的时候,灯会观察到或者被通知就会点亮。Rxjava也是这样,Observable发出事件,Subscriber执行事件。在我们上面的代码中,通过如下代码创建了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,有了事件,我们再来创建一个Subscriber,让他来执行事件
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
L.e(s);
}
@Override
public void onCompleted() {
L.e("success");
}
@Override
public void onError(Throwable e) {
}
};
可以看见他有三个方法:
- onNext:执行事件的地方,Observable发出的事件将会在这里被执行。
- onCompleted:当一个事件完结的时候,必然会回调的方法。
- onError:当执行事件过程中发生错误,必然会回调的方法。
观察者和被观察者都创建好了,也就是灯和开关都有了,那我们该用电线把他们连接起来了。
myObservable.subscribe(mySubscriber);
可能大部分同学看到这里都会很纳闷,怎么被观察者订阅了观察者?其实这样的设计是为了不对流式API的设计造成影响,所以我们在理解的时候得稍微的转换一下。
解决了上面的问题,看到这的同学也会说,为了异步输出一个字符串写了这么多代码是不是太多余了?我用AsyncTask或者handler怎么写都比你这个简洁。那么我们下面来将上面的代码简洁一下。
了解
RxJava有很多的函数来方便我们的使用,比如我们可以使用just方法来创建一个只发出一个事件就结束的Observable,看代码:
Observable<String> myObservable = Observable.just("Hello, world!");
下面我们再来简化Subscriber,Subscriber有三个重载方法, Action1 < Object >,Action1< Throwable >以及Action0。分别对应了OnNext,OnComplete, OnError函数。当我们只关心OnNext方法时,上述代码可以简化为:
Action1<String> action = new Action1<String>() {
@Override
public void call(String s) {
L.e(s);
}
};
那么我们再把他们连接起来:
myObservable.subscribe(action);
是不是一下简洁了很多,什么?还不够?那我可要祭出大杀器了:
Observable.just("Hello, world!")
.subscribe(s -> L.e(s));
是不是被震惊了,上述的代码可以用这简单的一行来表示。在这里我们用到了lambda表达式,至于什么是lambda表达式,相信很多同学都有所耳闻了,在这里我们就不详细解释了,具体可以去看其他文章或者我再写一篇关于lambda的?(又给自己挖坑了)。如何想要使用的话,请确保你的jdk版本为1.8,并在项目的Gradle文件里在defaultConfig的闭包里加入:
jackOptions {
enabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
然后再编译一下,就可以开心的使用了,低版本的话可以使用retrolambda,当然你在使用lambda爽快的同时可能也会导致自己或者同事难以理解自己的代码,取舍就在自己了。
好了,看完上面的内容,想必大家都已经产生了一些兴趣。但是我们的第一次接触呢到这里就结束了,更有魅力的东西我们留着下次再说,下次我将把RxJava与Retrofit结合起来,分享给大家,哈哈哈。
大家可以通过下面的一些文章去更好的了解,毕竟我道行还浅。