RxAndroid 和 RxKotlin

ReactiveX 系列文章目錄


RxAndroid

implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
RxAndroid.png

RxAndroid 是在 RxJava 上的擴展,用法和 RxJava 一樣脱柱。結(jié)構(gòu)比較簡單,主要用在 Android 上的線程切換拉馋。

Observable.just(1,2)
    .subscribeOn(Schedulers.io())
    // 切換到 Android 的主線程
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(observerInt)

看源碼

public static Scheduler mainThread() {
    return RxAndroidPlugins.onMainThreadScheduler(MAIN_THREAD);
}

private static final Scheduler MAIN_THREAD = RxAndroidPlugins.initMainThreadScheduler(
    new Callable<Scheduler>() {
        @Override public Scheduler call() throws Exception {
            return MainHolder.DEFAULT;
        }
    });
    
private static final class MainHolder {
    static final Scheduler DEFAULT = new HandlerScheduler(new Handler(Looper.getMainLooper()));
}

通過 Looper.getMainLooper() 構(gòu)建的 Handler 來切換榨为。

看 HandlerScheduler 內(nèi)部類 HandlerWorker 的 schedule 方法:

@Override
public Disposable schedule(Runnable run, long delay, TimeUnit unit) {
    ...

    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, 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;
}

內(nèi)部原理就是 Android 的 Handler 這一套機制。

除了切換到主線程還可以根據(jù)某個線程上的 Looper 切換到指定線程上煌茴。

Looper backgroundLooper = // ...
Observable.just("one", "two", "three", "four", "five")
        .observeOn(AndroidSchedulers.from(backgroundLooper))
        .subscribe(/* an Observer */)

就是根據(jù)傳入的 Looper 構(gòu)建一個 Handler随闺。

public static Scheduler from(Looper looper) {
    if (looper == null) throw new NullPointerException("looper == null");
    return new HandlerScheduler(new Handler(looper));
}

RxKotlin

implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'

用 Kotlin 語言寫 RxJava 的功能就行,但 Kotlin 本身有些語言特性(比如擴展)蔓腐,使用 RxKotlin 后語法可以更簡潔矩乐。類似 Google 的 ktx 框架,沒什么新功能合住,只是對一些方法的封裝使得使用起來更方便绰精。

RxJava 是調(diào)用 Observable 的方法撒璧,比如:

Observable.fromArray("a","b","c").subscribe(observerStr)

而使用 RxKotlin 就是這樣

arrayOf("a", "b", "c").toObservable().subscribe(observerStr)

源碼

fun <T : Any> Array<T>.toObservable(): Observable<T> = Observable.fromArray(*this)

在數(shù)組上定義的擴展方法 toObservable() 內(nèi)部其實就是調(diào)用的 fromArray 方法透葛。

其實擴展方法更符合人的思維,不像原來那種卿樱,乍看之下是別扭的僚害。

全部的擴展方法見 https://github.com/ReactiveX/RxKotlin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萨蚕,隨后出現(xiàn)的幾起案子靶草,更是在濱河造成了極大的恐慌,老刑警劉巖岳遥,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕翔,死亡現(xiàn)場離奇詭異,居然都是意外死亡浩蓉,警方通過查閱死者的電腦和手機派继,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捻艳,“玉大人驾窟,你說我怎么就攤上這事∪瞎欤” “怎么了绅络?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘁字。 經(jīng)常有香客問我恩急,道長,這世上最難降的妖魔是什么纪蜒? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任假栓,我火速辦了婚禮,結(jié)果婚禮上霍掺,老公的妹妹穿的比我還像新娘匾荆。我一直安慰自己,他們只是感情好杆烁,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布牙丽。 她就那樣靜靜地躺著,像睡著了一般兔魂。 火紅的嫁衣襯著肌膚如雪烤芦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天析校,我揣著相機與錄音构罗,去河邊找鬼。 笑死智玻,一個胖子當(dāng)著我的面吹牛遂唧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吊奢,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼盖彭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起召边,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤铺呵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隧熙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體片挂,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年贞盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了宴卖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡邻悬,死狀恐怖症昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情父丰,我是刑警寧澤肝谭,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蛾扇,受9級特大地震影響攘烛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镀首,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一坟漱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧更哄,春花似錦芋齿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麻敌,卻和暖如春栅炒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背术羔。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工赢赊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人级历。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓释移,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鱼喉。 傳聞我的和親對象是個殘疾皇子秀鞭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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