与RxJava的第一次接触

时间:2021-01-11 20:54:16

转载请注明出处
作者: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) {
            }
        };

可以看见他有三个方法:

  1. onNext:执行事件的地方,Observable发出的事件将会在这里被执行。
  2. onCompleted:当一个事件完结的时候,必然会回调的方法。
  3. 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结合起来,分享给大家,哈哈哈。

大家可以通过下面的一些文章去更好的了解,毕竟我道行还浅。

给 Android 开发者的 RxJava 详解
深入浅出RxJava系列