响应式编程RxJava、RxAndroid的基本介绍

RxAndroid是RxJava在Android上的一个扩展,大牛JakeWharton的项目。和Retorfit组合起来使用,效果不是一般的好。

1.RxJava是干嘛的
  Rx(Reactive Extensions)是一个库,用来处理事件和异步任务,在很多语言上都有实现,RxJava是Rx在Java上的实现。简单来说,RxJava就是处理异步的一个库,最基本是基于观察者模式来实现的。通过Obserable和Observer的机制,实现所谓响应式的编程体验。   Android的童鞋都知道,处理异步事件,现有的AsyncTask、Handler,不错的第三方事件总线EventBus、OTTO等等都可以处理。并且大部分童鞋应该都很熟练了。而且经我目前的学习来看,RxJava这个库,上手确实有门槛,不是拿来就能用。但是作为一个猿,那些可能出现的优秀的框架技术,及时的跟进和学习是必要的,从中汲取营养才能帮助自己成长。况且有童鞋已经表示,它完全可以替代EventBus和OTTO,来看看吧。

2.RxJava的优势
  最概括的两个字:简洁。而且当业务越繁琐越复杂时这一点就越显出优势——它能够保持简洁。简洁,不意味着代码突然变得很少,而是说逻辑上变得很清晰,简单了,而且简单的demo看不出来,真正投入项目,代码也会相应减少很多,使用了应该就有体会了。它提供的各种功能强悍的操作符真的很强大。

3.基本使用流程

    compile 'io.reactivex:rxjava:1.2.6'
    compile 'io.reactivex:rxandroid:1.2.1'

导入上面依赖,配置完之后就可以使用RxJava的API了。介绍两个个关键的类: **Observable 、Subscriber **
即:被观察者(Observable)和观察者(Subscriber),其实我觉得叫发布者和订阅者更好理解一些,但大家都叫被观察者和观察者。
  主干的使用过程就是1.创建被观察者。2.创建观察者。3.将二者建立联系。完毕。然后被观察中发出信息触发观察者的动作,执行相应的方法,就这样。你先别急着吐槽它很平庸。它的强大在于这个过程中提供的各种操作变换的技巧会让你可以简洁的处理相当繁琐的代码逻辑。
先看一个简单的demo:

1、先创建个被观察者,很好理解,就是发射数据用的:

   Observable sender = Observable.create(new Observable.OnSubscribe() {

           @Override
            public void call(Subscriber subscriber) {

                subscriber.onNext("Hi,Weavey!");  //发送数据
                subscriber.onNext("Hello World");  //发送数据
                subscriber.onCompleted();  //发送数据完成
            }
        });

2、再创建个数据接收源,同理,接收数据用的:


   Observer receiver = new Observer() {

            @Override
            public void onCompleted() {

                //数据接收完成时调用
            }

            @Override
            public void onError(Throwable e) {

                //发生错误调用
            }

            @Override
            public void onNext(String s) {

               //正常接收数据调用
                System.out.print(s);  //将接收到来自sender的问候"Hi,Weavey!"
            }
        };

3、好了,将观察者和被观察者关联起来:

  sender.subscribe(receiver);

上面的例子中,当Observable发射数据时,会依次调用Subscriber的onNext()方法,将发射的数据作为参数传给onNext(),如果出错,则会调用Subscriber的onError()方法,完成所有数据发射后,调用onCompleted()方法,整个过程完毕。
而RxJava所有的一切都将围绕这两个点展开,一个是发射数据,一个是接收数据,是不是很通俗易懂?  但是,subcribe()方法默认在当前线程被调用。所以,这样使用的话,被观察者和观察者的所有的动作都是在同一个线程完成的,没卵用…
  但是当然肯定不会就这个程度了,RxJava有两个方法可以很方便的指定观察者和被观察者代码运行的线程,RxAndroid还有一个扩展,可以指定在UI线程运行。

//设置观察者和发布者代码所要运行的线程后注册观察者
  .subscribeOn(Schedulers.io()) //被观察者在子线程执行
.observeOn(AndroidSchedulers.mainThread())//在UI线程执行观察者的方法
.subscribe(subscriber);

通过Scheduler作为参数来指定代码运行的线程,非常方便,好用到不行…其他常用的参数还有:

  • Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。

  • ** Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。 **

  • **Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免建不必要的线程。 **

  • **Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。 **

另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。

基本概念

Observable:发射源,英文释义“可观察的”,在观察者模式中称为“被观察者”或“可观察对象”;

Observer:接收源,英文释义“观察者”,没错!就是观察者模式中的“观察者”,可接收Observable、Subject发射的数据;

Subscriber:“订阅者”,也是接收源,那它跟Observer有什么区别呢?Subscriber实现了Observer接口,比Observer多了一个最重要的方法unsubscribe( ),用来取消订阅,当你不再想接收数据了,可以调用unsubscribe( )方法停止接收,Observer 在 subscribe() 过程中,最终也会被转换成 Subscriber 对象,一般情况下,建议使用Subscriber作为接收源;

Subscription :Observable调用subscribe( )方法返回的对象,同样有unsubscribe( )方法,可以用来取消订阅事件;

Action0:RxJava中的一个接口,它只有一个无参call()方法,且无返回值,同样还有Action1,Action2...Action9等,Action1封装了含有 1 个参的call()方法,即call(T t),Action2封装了含有 2 个参数的call方法,即call(T1 t1,T2 t2),以此类推;

Func0:与Action0非常相似,也有call()方法,但是它是有返回值的,同样也有Func0、Func1...Func9;

Observable创建方式

以上介绍了主干使用流程,从这里我们往细一点再看。前文说了,RxJava的强大之处在于它的各种操作符。在创建Observable对象的方式上,同样有很多方便的操作符的实现,上面是通过Observable.create()方法创建的observable对象,这里介绍其他几个常用的方法。

Observable的创建
1.使用create( ),最基本的创建方式:

normalObservable = Observable.create(new Observable.OnSubscribe() {
  @Override
  public void call(Subscriber subscriber) {
      subscriber.onNext("create1"); //发射一个"create1"的String
      subscriber.onNext("create2"); //发射一个"create2"的String
      subscriber.onCompleted();//发射完成,这种方法需要手动调用onCompleted,才会回调Observer的onCompleted方法
  }});

2.使用just( ),将为你创建一个Observable并自动为你调用onNext( )发射数据:

justObservable = Observable.just("just1","just2");//依次发送"just1"和"just2"

3.通过from创建Observable:

通过from创建Observable:

     //Teacher为一个数据Bean,包含姓名,年龄,住址三个字段
     List teachers = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            teachers.add(new Teacher("name" + i, i, "place" + i));
        }
        //from方法支持继承了Interable接口的参数,所以常用的数据结构(Map、List..)都可以转换
        Observable fromObservale = Observable.from(teachers);
        fromObservale.subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.i(TAG, "from(teachers)  onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "from(teachers)  " + e.getMessage());
            }

            @Override
            public void onNext(Teacher teacher) {
                //依次接收到teachers中的对象
                Log.d(TAG, "from(teachers)  onNext:" + teacher.toString());
            }
        });

用from方法创建Observable,可以传入一个数组,或者一个继承了Iterable的类的对象作为参数,也就是说,java中常用的数据结构如List、Map等都可以直接作为参数传入from()方法用以构建Observable。这样,当Observable发射数据时,它将会依次把序列中的元素依次发射出来。

4.使用defer( ),有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable:

deferObservable = Observable.defer(new Func0>() {
  @Override
  //注意此处的call方法没有Subscriber参数
  public Observable call() {
      return Observable.just("deferObservable");
  }});

5.使用interval( ),创建一个按固定时间间隔发射整数序列的Observable,可用作定时器:

intervalObservable = Observable.interval(1, TimeUnit.SECONDS);//每隔一秒发送
一次

6.使用range( ),创建一个发射特定整数序列的Observable,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异常:

rangeObservable = Observable.range(10, 5);//将发送整数10,11,12,13,14

range发射从n到m的整数序列,repeat可以指定重复次数,以上发射的次序为:3,4,5,6,7,3,4,5,6,7。这里用到的Action0和Action1是两个可以替代Subscriber的接口,具体可以参见相关文档和源码实现,这里不深入介绍。
  其他还有Interval、Defer、Start等方法就不一一介绍了,本文主要是帮助初次接触的童鞋入门,RxJava的操作符非常丰富,这里很难一一说明,更多的内容要还需要大家自己去熟悉和探究。

7.使用timer( ),创建一个Observable,它在一个给定的延迟后发射一个特殊的值,等同于Android中Handler的postDelay( )方法:

timeObservable = Observable.timer(3, TimeUnit.SECONDS);  //3秒后发射一个值

8.使用repeat( ),创建一个重复发射特定数据的Observable:

repeatObservable = Observable.just("repeatObservable").repeat(3);//重复发射3次

你可能感兴趣的:(响应式编程RxJava、RxAndroid的基本介绍)