【Android TimeCat】 RxJava的使用(一)基本用法

背景

Time Cat中,网络请求是必不可少的。而网络请求最好不要放在主线程中,因为网络请求要监听服务端的回应,耗时长。所以我们一般把网络请求异步处理。异步的话我们一般有现成的 AsyncTask / Handler / View.postdelay / … , 不过,今天我们用RxJava。RxJava的本质是异步处理,RxJava的好处就在于它的简洁性,逻辑简单的时候看不出RxJava的优势,想必大家都知道在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。这时候RxJava的优势就来了,随着程序逻辑变得越来越复杂,它依然能够保持简洁

观察者模式

首先要先介绍一下观察者模式(可能比喻的不够恰当,意思到了就好);

  • 观察者:监视着被观察者的行为,当被观察者某个状态改变的时候会通知观察者,观察者会执行对应的操作;
  • 被观察者:被监视的对象,当某个状态改变的时候会通知观察者;
  • 订阅(或注册):将观察者和被观察者建立联系。

(很乱?来个栗子?)
这里举一个我个常用的例子,点击Button后触发OnClickListener
中的onClick()事件。在这个事件中他们的角色分别如下:

  • 观察者:OnClickListener;
  • 被观察者:Button;
  • 订阅(或注册):setOnClickListener()。

RxJava中的观察者模式

在上面介绍了观察者模式,这里也将RxJava中的三个角色进行一下角色分配

  • 观察者:Observer;
  • 被观察者:Observable;
  • 订阅(或注册):subscribe()。

观察者

Observer 即观察者,它决定事件触发的时候将有怎样的行为。

RxJava 观察者的事件回调方法除了普通事件onNext()(相当于onClick()/onEvent())之外,还定义了两个特殊的事件:onCompleted()onError()

  • onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext()发出时,需要触发onCompleted()方法作为标志。
  • onError(): 事件队列异常。在事件处理过程中出异常时,onError()会被触发,同时队列自动终止,不允许再有事件发出。

在一个正确运行的事件序列中,onCompleted()onError()有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted():和onError()二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

被观察者

Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。可以使用create()just(T...)from(T[])from(Iterable<? extends T>)来创建一个 Observable ,并为它定义事件触发规则。

订阅

创建了ObservableObserver之后,再用subscribe()方法将它们联结起来

Talk is cheap, show me the code

例:打印字符串

  1. 添加依赖

    1
    2
    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'
  2. 依次创建观察者,被观察者,订阅

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    //创建一个观察者
    Observer<String> observer = new Observer<String>() {

    @Override
    public void onCompleted() {
    Log.i(TAG, "Completed");
    }

    @Override
    public void onError(Throwable e) {
    Log.i(TAG, "Error");
    }

    @Override
    public void onNext(String s) {
    Log.i(TAG, s);
    }
    };
    //使用Observable.create()创建被观察者
    Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
    subscriber.onNext("Hello");
    subscriber.onNext("Wrold");
    subscriber.onCompleted();
    }
    });
    //订阅
    observable1.subscribe(observer);

以上用到的都是rx包里面的,别用错了!!!

1
2
3
import rx.Observable;
import rx.Observer;
import rx.Subscriber;

上面完成了一次Rxjava的基本使用,会在log里显示Hello World

参考

https://www.jianshu.com/p/19cac3c5b106
http://gank.io/post/560e15be2dca930e00da1083

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器