RxJava最核心的是Observables(被觀察者,事件源)和Subscribers(訂閱者)以及Observer(觀察者) 。三者關(guān)系,通過(guò)訂閱者綁定,被觀察者將信息發(fā)送給觀察者。
RxAndroid是RxJava的一個(gè)針對(duì)Android平臺(tái)的擴(kuò)展。它包含了一些能夠簡(jiǎn)化Android開(kāi)發(fā)的工具。它能夠優(yōu)雅地處理異步請(qǐng)求. RxAndroid配合Lambda表達(dá)式, 精簡(jiǎn)處理回調(diào), 使程序更具有可讀性.。
使用:
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
使用方法
回調(diào)方法:onNext() onCompleted() onError() 其中onCompleted和onError相互排斥,只會(huì)觸發(fā)其中一個(gè)。
1、創(chuàng)建觀察者
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(tag, "onNext: " + s);
}
@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
Observer :決定事件觸發(fā)時(shí)候的行為(上面三個(gè)回調(diào)方法)
Subscriber:一個(gè)實(shí)現(xiàn)了Observer的抽象類。增加了 onstart方法。作用于做一些準(zhǔn)備工作。(例如數(shù)據(jù)清0),
在訂閱者發(fā)生的線程運(yùn)行,所以不一定為主線程。unsubscribe()方法,用于取消訂閱,這個(gè)方法
執(zhí)行后,觀察者將不再接收事件。在OnPause(),onStop()中調(diào)用,避免內(nèi)存泄漏。
2 、創(chuàng)建被觀察者
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("A");
subscriber.onNext("B");
subscriber.onNext("C");
subscriber.onCompleted();
}
});```
Observable:決定什么時(shí)候觸發(fā)事件以及觸發(fā)事件的類型。
當(dāng) Observable 被訂閱的時(shí)候,OnSubscribe 的 call() 方法會(huì)自動(dòng)被調(diào)用,事件序列
就會(huì)依照設(shè)定依次觸發(fā)。
除了create方法之外,RxJava還有一些快捷的基本事件創(chuàng)建方法。
如:
######just(T...): 將傳入的參數(shù)依次發(fā)送出來(lái)。
Observable observable = Observable.just("A", "B", "C");//效果等同于上面
######from(T [] ) / from(Iterable<? extends T>) : 將傳入的數(shù)組或 Iterable 拆分成具體對(duì)象后,依次發(fā)送出來(lái)。
String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);//效果等同于上面
3、創(chuàng)建訂閱者:
創(chuàng)建了 Observable 和 Observer 之后,再用 subscribe() 方法將它們聯(lián)結(jié)起來(lái),整條鏈子就可以工作了。(observable.subscribe(observer);
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
線程控制Scheduler
在不指定線程的情況下,遵循線程不變的原則。
Observable.just(1, 2, 3, 4)
.subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回調(diào)發(fā)生在主線程
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer number) {
Log.d(tag, "number:" + number);
}
});
Schedulers.immediate(): 直接在當(dāng)前線程運(yùn)行,相當(dāng)于不指定線程。這是默認(rèn)的 Scheduler。
Schedulers.newThread(): 總是啟用新線程,并在新線程執(zhí)行操作。
Schedulers.io(): I/O 操作(讀寫文件、讀寫數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多,區(qū)別在于 io() 的內(nèi)部實(shí)現(xiàn)是是用一個(gè)無(wú)數(shù)量上限的線程池,可以重用空閑的線程,因此多數(shù)情況下 io() 比 newThread() 更有效率。不要把計(jì)算工作放在 io() 中,可以避免創(chuàng)建不必要的線程。
Schedulers.computation(): 計(jì)算所使用的 Scheduler。這個(gè)計(jì)算指的是 CPU 密集型計(jì)算,即不會(huì)被 I/O 等操作限制性能的操作,例如圖形的計(jì)算。這個(gè) Scheduler 使用的固定的線程池,大小為 CPU 核數(shù)。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時(shí)間會(huì)浪費(fèi) CPU。
另外, Android 還有一個(gè)專用的 AndroidSchedulers.mainThread(),它指定的操作將在 Android 主線程運(yùn)行。