RxJava——線程控制

前言

對于一般的需求場景珊蟀,需要在子線程中實現(xiàn)耗時的操作菊值;然后回到主線程實現(xiàn) UI操作應(yīng)用到 RxJava模型中外驱,可理解為:

被觀察者 (Observable)子線程 中生產(chǎn)事件(如實現(xiàn)耗時操作等等)
觀察者(Observer)主線程 接收 & 響應(yīng)事件(即實現(xiàn)UI操作


實現(xiàn)方式

采用 RxJava內(nèi)置的線程調(diào)度器( Scheduler )育灸,即通過 功能性操作符subscribeOn() & observeOn()實現(xiàn)


subscribeOn

使用該方法可以指定被觀察者執(zhí)行方法位于的線程。

注意:該方法調(diào)用只能生效一次昵宇,即第一次調(diào)用后磅崭,再調(diào)用subscribeOn無法改變其執(zhí)行線程的位置。

observeOn

使用該方法指定觀察者事件響應(yīng)位于的線程瓦哎。

注意:該方法可調(diào)用多次砸喻,每一次調(diào)用observeOn,后續(xù)操作線程就會切換一次,這里的后續(xù)操作指的是調(diào)用observeOn后蒋譬,在下一個observeOn前指定的事件監(jiān)聽操作


代碼實現(xiàn)

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
        Log.v("rxJava","Observable thread :" + Thread.currentThread().getName());
        emitter.onNext(1);
        emitter.onNext(2);
        emitter.onNext(3);
        emitter.onComplete();
    }
}).subscribeOn(Schedulers.io()) // 指定被觀察者執(zhí)行線程
        .observeOn(Schedulers.newThread()) // 切換到新線程
        .doOnNext(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.v("rxJava","do on next thread :" + Thread.currentThread().getName());
            }
        })
        .observeOn(Schedulers.newThread()) // 切換到另一個新線程
        .filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                Log.v("rxJava","filter thread:"+ Thread.currentThread().getName());
                return true;
            }
        })
        .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.v("rxJava","Observer onSubscribe thread :" + Thread.currentThread().getName());
            }

            @Override
            public void onNext(Integer value) {
                Log.v("rxJava","Observer onNext thread :" + Thread.currentThread().getName());
            }

            @Override
            public void onError(Throwable e) {
                Log.v("rxJava","Observer onError thread :" + Thread.currentThread().getName());
            }

            @Override
            public void onComplete() {
                Log.v("rxJava","Observer onComplete thread :" + Thread.currentThread().getName());
            }
        });

運行結(jié)果

V/rxJava: Observer onSubscribe thread :main
V/rxJava: Observable thread :RxCachedThreadScheduler-1
V/rxJava: do on next thread :RxNewThreadScheduler-1
V/rxJava: do on next thread :RxNewThreadScheduler-1
V/rxJava: do on next thread :RxNewThreadScheduler-1
V/rxJava: filter thread:RxNewThreadScheduler-2
V/rxJava: Observer onNext thread :RxNewThreadScheduler-2
V/rxJava: filter thread:RxNewThreadScheduler-2
V/rxJava: Observer onNext thread :RxNewThreadScheduler-2
V/rxJava: filter thread:RxNewThreadScheduler-2
V/rxJava: Observer onNext thread :RxNewThreadScheduler-2
V/rxJava: Observer onComplete thread :RxNewThreadScheduler-2

注意:onSubscribe方法總是執(zhí)行在調(diào)用subscribe方法的線程


線程可選參數(shù)

schedulers.io()

這個調(diào)度器時用于I/O操作割岛。它基于根據(jù)需要,增長或縮減來自適應(yīng)的線程池犯助。我們將使用它來修復(fù)StrictMode檢測到的違規(guī)做法癣漆。由于它專用于I/O操作,所以并不是RxJava的默認(rèn)方法剂买;正確的使用它是由開發(fā)者決定的惠爽。 重點需要注意的是線程池是無限制的,大量的I/O調(diào)度操作將創(chuàng)建許多個線程并占用內(nèi)存瞬哼。一如既往的是婚肆,我們需要在性能和簡捷兩者之間找到一個有效的平衡點。

Schedulers.computation()

這個是計算工作默認(rèn)的調(diào)度器坐慰,它與I/O操作無關(guān)较性。它也是許多RxJava方法的默認(rèn)調(diào)度器:buffer(),debounce(),delay(),interval(),sample(),skip()。

Schedulers.immediate()

這個調(diào)度器允許你立即在當(dāng)前線程執(zhí)行你指定的工作结胀。它是timeout(),timeInterval(),以及timestamp()方法默認(rèn)的調(diào)度器赞咙。

Schedulers.newThread()

指定一個新線程來執(zhí)行任務(wù),如果有多個步驟且每個步驟都使用這個方法調(diào)度把跨,則每個步驟都是在一個新的線程中人弓,而不是同一個線程。

Schedulers.trampoline()

當(dāng)我們想在當(dāng)前線程執(zhí)行一個任務(wù)時着逐,并不是立即崔赌,我們可以用.trampoline()將它入隊意蛀。這個調(diào)度器將會處理它的隊列并且按序運行隊列中每一個任務(wù)。它是repeat()和retry()方法默認(rèn)的調(diào)度器健芭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末县钥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慈迈,更是在濱河造成了極大的恐慌若贮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒留,死亡現(xiàn)場離奇詭異谴麦,居然都是意外死亡,警方通過查閱死者的電腦和手機伸头,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門匾效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恤磷,你說我怎么就攤上這事面哼。” “怎么了扫步?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵魔策,是天一觀的道長。 經(jīng)常有香客問我河胎,道長闯袒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任仿粹,我火速辦了婚禮搁吓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吭历。我一直安慰自己堕仔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布晌区。 她就那樣靜靜地躺著摩骨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朗若。 梳的紋絲不亂的頭發(fā)上恼五,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音哭懈,去河邊找鬼灾馒。 笑死,一個胖子當(dāng)著我的面吹牛遣总,可吹牛的內(nèi)容都是我干的睬罗。 我是一名探鬼主播轨功,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼容达!你這毒婦竟也來了古涧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤花盐,失蹤者是張志新(化名)和其女友劉穎羡滑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算芯,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡柒昏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了也祠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙楚。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡近速,死狀恐怖诈嘿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情削葱,我是刑警寧澤奖亚,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站析砸,受9級特大地震影響昔字,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜首繁,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一作郭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弦疮,春花似錦夹攒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啸罢,卻和暖如春编检,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扰才。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工允懂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衩匣。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓蕾总,卻偏偏與公主長得像酣倾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谤专,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

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

  • 本篇代碼見:RxJava_Demo_Translater 這里開始學(xué)習(xí)RxJava線程控制(切換/調(diào)度)躁锡。一、Rx...
    Jotyy閱讀 329評論 0 1
  • 我從去年開始使用 RxJava 置侍,到現(xiàn)在一年多了映之。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,493評論 7 62
  • 最近項目里面有用到Rxjava框架,感覺很強大的巨作秕衙,所以在網(wǎng)上搜了很多相關(guān)文章蠢甲,發(fā)現(xiàn)一片文章很不錯,今天把這篇文...
    Scus閱讀 6,881評論 2 50
  • 人生不存在走彎路据忘,一切都是最好的安排鹦牛! 二十幾歲時沒加過班,沒考過證勇吊。上班下班過著正常的生活曼追,雖然抱怨過工資低位,...
    小八雜談閱讀 201評論 1 1
  • 10月15日晚上汉规,以“怦然新動”為主題的南岳學(xué)院2017級迎新晚會在西校區(qū)排演廳舉行礼殊。學(xué)院黨總支書記匡云山、院長王...
    衡陽師范學(xué)院閱讀 153評論 0 0