最近开始做实际的Android项目,开发的组长就先丢给我一堆开源项目,让我先去熟悉一下,其中第一个就是RxJava。于是大概花了一个上午的时间学习了一下,发现这确实是个非常强大的工具!目前网络上比较全面的教程各有千秋,在此整理出一份更适合入门学习的教程。希望对Android的初学者们有所帮助。

1.什么是RxJava


RxJava的核心其实就是异步处理,比如现在我们从网络上读取数据,然后在界面上显示读取的数据,读取数据和界面的刷新如果是同步的就常常会造成界面的卡顿感,使用异步就可以避免这个问题。事实上,Android本身的开发包是完全支持异步的,比如Handler、AsyncTask等。


那么,为什么要选择RxJava呢?


因为它的代码可读性极好!并且还提供了非常便捷的线程切换功能!


说得再多,不如贴一段代码:


Observable<String> dataSender = Observable.create(new Observable.OnSubscribe<String>(){

            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("data1");
                subscriber.onNext("data2");
                subscriber.onNext("data3");
                subscriber.onNext("data4");
            }
        });
        dataSender.map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                s = "transformed "+s;
                return s;
            }
        }).subscribeOn(Schedulers.io())
          .observeOn(Schedulers.immediate())
          .subscribe(new Action1<String>() {
              @Override
              public void call(String s) {
                     System.out.println(s);
              }
        });

这段代码就是本片博客的全部示例,读者完全可以拷贝之后在单元测试中运行。这段代码实现了一个数据源并且给这个数据源注册了一个监听者,每当有数据从数据源传入,我们就会打印这段数据。代码乍一看有点复杂,但你可以很快发现它的特点:流式。每一个操作在代码上能以一个个步骤的形式很清晰地显示出来,只要你了解了那些单词的含义,读起来会非常非常爽,而不是陷入一大堆嵌套多层的回调方法中。



2.RxJava原理



细心的读者可以发现代码中第一个词Observable,如果对设计模式有所了解的话,很快就能联想到观察者模式。没错,整个RxJava其实就是一个观察者模式的实现。只要你了解观察者模式,那么就可以很快地理解RxJava。



如果你还不知道观察者模式,建议在CSDN上进行搜索,可以获得非常详细的解答。





3.动手写代码



第一步,创建一个被观察者:



Observable<String> dataSender = Observable.create(new Observable.OnSubscribe<String>(){

            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("data1");
                subscriber.onNext("data2");
                subscriber.onNext("data3");
                subscriber.onNext("data4");
            }
        });



这里,String表示数据的类型,call方法是用来回调的,当这个数据源被subscribe之后就会执行其中的方法。



subscriber就是我们的观察者类了,onNext方法就是给被观察者回调的方法。





接下来,可以对数据进行处理,最常见的就是map方法,它可以将数据转化成另一套数据,比如,我们给每行数据前面加上transformed



dataSender.map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                s = "transformed "+s;
                return s;
            }
        });

然后,我们就可以见证RxJava最神奇的地方:线程管理



先看代码:



dataSender.map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                s = "transformed "+s;
                return s;
            }
        }).subscribeOn(Schedulers.io())
          .observeOn(Schedulers.immediate())
          .subscribe(new Action1<String>() {
              @Override
              public void call(String s) {
                     System.out.println(s);
              }
        });

这里就可以看出RxJava流式编程的特点,我想这应该式装饰者模式的一个典型应用(没读源码,只是推测)



subscribeOn方法可以设置dataSender的执行的线程;



observeOn方法可以设置观察者执行的线程;



subscribe方法注册了一个Action1对象作为观察者。这也是RxJava定义的对象,十分简单。





RxJava仅仅只要一行代码就可以实现线程的切换,是不是非常神奇!