RxJava2.x (二) 操作符和調(diào)度器

上一篇文章介紹了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(觀察者)仍然在主線程中接收事件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容