上一篇文章介紹了RxJava基礎(chǔ),這一篇介紹一下RxJava2.0中操作符和調(diào)度器的使用。
一、操作符
map()操作符
map()操作符,就是把原來的Observable對象轉(zhuǎn)換成另一個(gè)Observable對象,同時(shí)將傳輸?shù)臄?shù)據(jù)進(jìn)行一些靈活的操作,方便Observer獲得想要的數(shù)據(jù)形式。
Observable observable = Observable.just("Hello RxJava2.0")
.map(newFunction() {
@Override
public String apply(@NonNullString s) throws Exception {
return s;
}
});
map()操作符,就是把原來的Observable對象轉(zhuǎn)換成另一個(gè)Observable對象,同時(shí)將傳輸?shù)臄?shù)據(jù)進(jìn)行一些靈活的操作,方便Observer獲得想要的數(shù)據(jù)形式。
flatMap()操作符
flatMap()對于數(shù)據(jù)的轉(zhuǎn)換比map()更加徹底,如果發(fā)送的數(shù)據(jù)是集合,flatmap()重新生成一個(gè)Observable對象,并把數(shù)據(jù)轉(zhuǎn)換成Observer想要的數(shù)據(jù)形式。它可以返回任何它想返回的Observable對象。
filter()操作符
.filter(newPredicate() {
@Override
public boolean test(@NonNullString s)throwsException {
return false;
}
})
filter()操作符,根據(jù)自己想過濾的數(shù)據(jù)加入相應(yīng)的邏輯判斷,返回true則表示數(shù)據(jù)滿足條件,返回false則表示數(shù)據(jù)需要被過濾。最后過濾出的數(shù)據(jù)將加入到新的Observable對象中,方便傳遞給Observer想要的數(shù)據(jù)形式。
take()操作符
take()操作符:輸出指定數(shù)量的結(jié)果。
doOnNext()
doOnNext()允許我們在每次輸出一個(gè)元素之前做一些額外的事情。
.doOnNext(newConsumer() {
@Override
public void accept(@NonNullString s) throwsException {
Log.e(TAG,"doOnNext");
}
});
以上就是一些常用的操作符,通過操作符的使用。我們每次調(diào)用一次操作符,就進(jìn)行一次觀察者對象的改變,同時(shí)將需要傳遞的數(shù)據(jù)進(jìn)行轉(zhuǎn)變,最終Observer對象獲得想要的數(shù)據(jù)。
二、調(diào)度器 Scheduler
Scheduler簡介
在不指定線程的情況下, RxJava 遵循的是線程不變的原則,即:在哪個(gè)線程調(diào)用 subscribe(),就在哪個(gè)線程生產(chǎn)事件;在哪個(gè)線程生產(chǎn)事件,就在哪個(gè)線程消費(fèi)事件。如果需要切換線程,就需要用到 Scheduler (調(diào)度器)
在RxJava 中,Scheduler,相當(dāng)于線程控制器,RxJava 通過它來指定每一段代碼應(yīng)該運(yùn)行在什么樣的線程。RxJava 已經(jīng)內(nèi)置了幾個(gè) Scheduler ,它們已經(jīng)適合大多數(shù)的使用場景。
Scheduler 的 API
Schedulers.immediate():直接在當(dāng)前線程運(yùn)行,相當(dāng)于不指定線程。這是默認(rèn)的 Scheduler。
Schedulers.newThread():總是啟用新線程,并在新線程執(zhí)行操作。
Schedulers.io():I/O 操作(讀寫文件、讀寫數(shù)據(jù)庫、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多,區(qū)別在于 io() 的內(nèi)部實(shí)現(xiàn)是用一個(gè)無數(shù)量上限的線程池,可以重用空閑的線程,因此多數(shù)情況下 io() 比 newThread() 更有效率。
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)行。
有了這幾個(gè) Scheduler ,就可以使用 subscribeOn() 和 observeOn() 兩個(gè)方法來對線程進(jìn)行控制了。subscribeOn(): 指定Observable(被觀察者)所在的線程,或者叫做事件產(chǎn)生的線程。 observeOn(): 指定 Observer(觀察者)所運(yùn)行在的線程,或者叫做事件消費(fèi)的線程。
下面用代碼展示下線程調(diào)度的使用:
Observable.create(newObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
Log.e(TAG,"所在線程:"+Thread.currentThread().getName());
e.onNext("Hello RxJava2.x");
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(newConsumer() {
@Override
public void accept(@NonNullString s)throws Exception {
Log.e(TAG,s);
Log.e(TAG,"所在線程:"+Thread.currentThread().getName());
}
});
輸出結(jié)果
com.jumei.android.rxjavademo E/RxJava2.x: 所在線程:RxCachedThreadScheduler-1
com.jumei.android.rxjavademo E/RxJava2.x: Hello RxJava2.x
com.jumei.android.rxjavademo E/RxJava2.x: 所在線程:main
由此可以看到Observable(被觀察者)發(fā)送事件的線程的確改變了, 是在一個(gè)叫 RxCachedThreadScheduler-1的線程中發(fā)送的事件, 而Observer(觀察者)仍然在主線程中接收事件。