【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
,并为它定义事件触发规则。
订阅
创建了Observable
和Observer
之后,再用subscribe()
方法将它们联结起来
Talk is cheap, show me the code
例:打印字符串
添加依赖
1
2compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'依次创建观察者,被观察者,订阅
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>() {
public void onCompleted() {
Log.i(TAG, "Completed");
}
public void onError(Throwable e) {
Log.i(TAG, "Error");
}
public void onNext(String s) {
Log.i(TAG, s);
}
};
//使用Observable.create()创建被观察者
Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Wrold");
subscriber.onCompleted();
}
});
//订阅
observable1.subscribe(observer);
以上用到的都是rx包里面的,别用错了!!!1
2
3import rx.Observable;
import rx.Observer;
import rx.Subscriber;
上面完成了一次Rxjava的基本使用,会在log里显示Hello World
。
参考
https://www.jianshu.com/p/19cac3c5b106
http://gank.io/post/560e15be2dca930e00da1083