RxJava2筆記(五抬伺、訂閱流程梳理以及線程切換次數(shù)有效性)

在前面的幾篇文章
RxJava2筆記(一螟够、事件訂閱流程)
RxJava2筆記(二、事件取消流程)
RxJava2筆記(三峡钓、訂閱線程切換)
RxJava2筆記(四妓笙、觀察者線程切換)
中,我們對(duì)RxJava的整個(gè)事件訂閱過程以及線程切換做了分析椒楣,本文我們將做一個(gè)總結(jié)性的梳理给郊。

我們總結(jié)下這段代碼的運(yùn)行流程

Observer<Integer> observer = new Observer<Integer>() {
    @Override
    public void onSubscribe(Disposable d) {
        Log.i(TAG, "onSubscribe--運(yùn)行線程:" + Thread.currentThread().getName());
        disposable = d;
    }

    @Override
    public void onNext(Integer integer) {
        Log.i(TAG, "onNext: " + integer + " --運(yùn)行線程:" + Thread.currentThread().getName());
        mToolbar.setTitle(integer + "");
    }

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: " + e.getMessage());
        e.printStackTrace();
    }

    @Override
    public void onComplete() {
        Log.i(TAG, "onComplete--運(yùn)行線程:" + Thread.currentThread().getName());
    }
};

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) {
        Log.i(TAG, "subscribe--運(yùn)行線程:" + Thread.currentThread().getName());
        emitter.onNext(1);
        emitter.onNext(2);
        emitter.onNext(3);
        emitter.onComplete();
    }
}).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(observer);

上完代碼再上一張流程圖,畫的不好捧灰,請(qǐng)見諒淆九。


RxJava事件流向.png

上圖中各個(gè)類對(duì)象以及相關(guān)方法會(huì)在哪一級(jí)調(diào)用均用相同的顏色標(biāo)出统锤。

從圖中可以看出,訂閱事件是逐級(jí)從下往上傳遞的炭庙,下層的subscribe觸發(fā)subscribeActual饲窿,在內(nèi)部調(diào)用上一級(jí)observable的subscribe訂閱,繼而觸發(fā)上一級(jí)observable的subscribeActual焕蹄,再在其內(nèi)部調(diào)用上上一級(jí)observable的subscribe訂閱逾雄,就這樣訂閱事件一直往上傳遞,直到調(diào)用最上游的數(shù)據(jù)源observable的subscribe訂閱腻脏。

而數(shù)據(jù)流的傳遞與此相反鸦泳,它是從上往下逐級(jí)下發(fā)的,當(dāng)訂閱事件傳遞到最上游的observable時(shí)永品,這個(gè)observable開始調(diào)用onNext方法發(fā)射數(shù)據(jù)做鹰,在這個(gè)方法內(nèi)調(diào)用下一級(jí)observer的onNext方法;在下一級(jí)observer的onNext方法內(nèi)鼎姐,再調(diào)用下下一級(jí)observer的onNext方法钾麸。直到最終調(diào)用最下游的observer的onNext方法,完成數(shù)據(jù)流下發(fā)炕桨。


  • 梳理完了訂閱流程饭尝,再來說下線程切換次數(shù)的有效性

  • 1、多次切換訂閱線程:
    假設(shè)我們進(jìn)行了兩次訂閱線程切換献宫,我們來梳理下流程:


    訂閱線程多次切換有效性.png

從上圖中可以看出钥平,即使我們多次調(diào)用subscribeOn切換訂閱線程,真正作用于訂閱事件的線程是離上游observable最近的一個(gè)遵蚜,根據(jù)RxJava的調(diào)用習(xí)慣也就是第一次調(diào)用subscribeOn帖池。所以訂閱線程切換只有第一次有效。

  • 2吭净、多次切換觀察者線程:
    同樣睡汹,假設(shè)進(jìn)行了兩次觀察者線程切換,看下流程:


    觀察者線程多次切換有效性.png

    可以看到寂殉,每一級(jí)的observer的onNext方法在不同的線程中均會(huì)被調(diào)用囚巴,所以observeOn方法每次調(diào)用都會(huì)生效,只不過通常情況下我們都是在最后一次切換觀察者線程后才真正接收數(shù)據(jù)來更新UI界面友扰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彤叉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子村怪,更是在濱河造成了極大的恐慌秽浇,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甚负,死亡現(xiàn)場(chǎng)離奇詭異柬焕,居然都是意外死亡审残,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門斑举,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搅轿,“玉大人,你說我怎么就攤上這事富玷¤捣兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵赎懦,是天一觀的道長雀鹃。 經(jīng)常有香客問我,道長铲敛,這世上最難降的妖魔是什么褐澎? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮伐蒋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迁酸。我一直安慰自己先鱼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布奸鬓。 她就那樣靜靜地躺著焙畔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪串远。 梳的紋絲不亂的頭發(fā)上宏多,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音澡罚,去河邊找鬼伸但。 笑死,一個(gè)胖子當(dāng)著我的面吹牛留搔,可吹牛的內(nèi)容都是我干的更胖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼隔显,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼却妨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起括眠,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤彪标,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掷豺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捞烟,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薄声,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坷襟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸柬。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婴程,靈堂內(nèi)的尸體忽然破棺而出廓奕,到底是詐尸還是另有隱情,我是刑警寧澤档叔,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布桌粉,位于F島的核電站,受9級(jí)特大地震影響衙四,放射性物質(zhì)發(fā)生泄漏铃肯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一传蹈、第九天 我趴在偏房一處隱蔽的房頂上張望押逼。 院中可真熱鬧,春花似錦惦界、人聲如沸挑格。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漂彤。三九已至,卻和暖如春灾搏,著一層夾襖步出監(jiān)牢的瞬間挫望,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工狂窑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媳板,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓蕾域,卻偏偏與公主長得像拷肌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旨巷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355