Rxjava2源碼淺析(三)

首先開始填坑革半,上篇文章最后的問題還沒有解決檬嘀,subscribeOn是如何切換線程的憾股。

先回顧一下:
使用方法:

 observable.subscribeOn(Schedulers.newThread());

我們直接看它重寫的abstract方法subscribeActual

@Override
    public void subscribeActual(final Observer<? super T> s) {
        final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(s);

        s.onSubscribe(parent);

        parent.setDisposable(scheduler.scheduleDirect(new Runnable() {
            @Override
            public void run() {
                source.subscribe(parent);
            }
        }));
    }

看到了一個(gè)熟悉的Runnable是不是瞬間熱淚盈眶英遭?這里就看到了在一個(gè)Runnable中訂閱了事件掷伙,由于是接口回調(diào),所以observable中的事件是運(yùn)行在這個(gè)線程的雳攘,而observer回調(diào)接口的時(shí)候就要看具體的observeOn是什么參數(shù)了带兜。

跟蹤這里的schedulerDirect方法。

 @NonNull
    public Disposable scheduleDirect(@NonNull Runnable run) {
        return scheduleDirect(run, 0L, TimeUnit.NANOSECONDS);
    }
@NonNull
    public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
        final Worker w = createWorker();

        final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);

        w.schedule(new Runnable() {
            @Override
            public void run() {
                try {
                    decoratedRun.run();
                } finally {
                    w.dispose();
                }
            }
        }, delay, unit);

        return w;
    }

而這個(gè)creatework()的具體實(shí)現(xiàn)類在HandlerScheduler中吨灭。

@Override
    public Worker createWorker() {
        return new HandlerWorker(handler);
    }

    private static final class HandlerWorker extends Worker {
        private final Handler handler;

        private volatile boolean disposed;

        HandlerWorker(Handler handler) {
            this.handler = handler;
        }

        @Override
        public Disposable schedule(Runnable run, long delay, TimeUnit unit) {
            if (run == null) throw new NullPointerException("run == null");
            if (unit == null) throw new NullPointerException("unit == null");

            if (disposed) {
                return Disposables.disposed();
            }

            run = RxJavaPlugins.onSchedule(run);

            ScheduledRunnable scheduled = new ScheduledRunnable(handler, run);

            Message message = Message.obtain(handler, scheduled);
            message.obj = this; // Used as token for batch disposal of this worker's runnables.

            handler.sendMessageDelayed(message, Math.max(0L, unit.toMillis(delay)));

            // Re-check disposed state for removing in case we were racing a call to dispose().
            if (disposed) {
                handler.removeCallbacks(scheduled);
                return Disposables.disposed();
            }

            return scheduled;
        }

        @Override
        public void dispose() {
            disposed = true;
            handler.removeCallbacksAndMessages(this /* token */);
        }

        @Override
        public boolean isDisposed() {
            return disposed;
        }
    }

而這里的handler是ObserveOn的時(shí)候new Handler(Looper.getMainLooper())時(shí)候創(chuàng)建的刚照,運(yùn)行在主線程。
所以這里通過handler發(fā)送一個(gè)帶有Runnable的消息喧兄,完成了new Thread和Main Thread的線程切換无畔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啊楚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浑彰,更是在濱河造成了極大的恐慌恭理,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郭变,死亡現(xiàn)場(chǎng)離奇詭異颜价,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诉濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門周伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人循诉,你說(shuō)我怎么就攤上這事横辆。” “怎么了茄猫?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)困肩。 經(jīng)常有香客問我划纽,道長(zhǎng),這世上最難降的妖魔是什么锌畸? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任勇劣,我火速辦了婚禮,結(jié)果婚禮上潭枣,老公的妹妹穿的比我還像新娘比默。我一直安慰自己,他們只是感情好盆犁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布命咐。 她就那樣靜靜地躺著,像睡著了一般谐岁。 火紅的嫁衣襯著肌膚如雪醋奠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天伊佃,我揣著相機(jī)與錄音窜司,去河邊找鬼。 笑死航揉,一個(gè)胖子當(dāng)著我的面吹牛塞祈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帅涂,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼议薪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胀葱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起笙蒙,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抵屿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捅位,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轧葛,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年艇搀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尿扯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焰雕,死狀恐怖衷笋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矩屁,我是刑警寧澤辟宗,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吝秕,受9級(jí)特大地震影響泊脐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烁峭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一容客、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧约郁,春花似錦缩挑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至己肮,卻和暖如春士袄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谎僻。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工娄柳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艘绍。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓赤拒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挎挖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 前言我從去年開始使用 RxJava 这敬,到現(xiàn)在一年多了。今年加入了 Flipboard 后蕉朵,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,164評(píng)論 6 151
  • 我從去年開始使用 RxJava 崔涂,到現(xiàn)在一年多了。今年加入了 Flipboard 后始衅,看到 Flipboard 的...
    Jason_andy閱讀 5,473評(píng)論 7 62
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法冷蚂,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法汛闸,繼承相關(guān)的語(yǔ)法蝙茶,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,635評(píng)論 18 399
  • 轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://www.reibang.com/p/6ef45f8ee79d本文出自:【張旭童的簡(jiǎn)書...
    張旭童閱讀 5,974評(píng)論 6 26
  • 注意力 冥想好吧诸老,鑒于本科時(shí)遇到過一位教心理咨詢的神棍老師畜侦,對(duì)冥想柠偶、內(nèi)觀哄辣、禪定等赔蒲,都條件反射式排斥。這是俺的偏見畸肆。...
    農(nóng)人閱讀 148評(píng)論 0 0