RxJava2.0另類理解:干細(xì)胞的進(jìn)化之路

(本文基于rxjava2.0/rxandroid2.0而寫)

RxJava很神奇!很神奇不是指它在GitHub上寫的“A library for composing asynchronous and event-based programs by using observable sequences.”揣非,而是它的設(shè)計(jì)模型很神奇。

我解析了它的源碼滴某,發(fā)現(xiàn)RxJava竟然是類似干細(xì)胞進(jìn)化辫诅。

RxJava的干細(xì)胞模型

RxJava的干細(xì)胞模型很簡(jiǎn)單,本質(zhì)上是基于觀察者模式的擴(kuò)展临庇,先上類圖零截。

主類示意圖

一個(gè)被觀察者虛類Observable麸塞,實(shí)現(xiàn)它必須實(shí)現(xiàn)subscribeActual,一個(gè)觀察者接口類Observer涧衙,它擴(kuò)展了一些接口哪工。OK,我們看看這個(gè)簡(jiǎn)單的結(jié)構(gòu)弧哎,能干點(diǎn)什么雁比。

首先,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Observable和Observer:

public class AObservable extends Observable<Integer>{

 @Override
 protected void subscribeActual(Observer<? super Integer> observer) {
 int a = 1+2;

 observer.onNext(a);
 observer.onComplete();
 }
}

(new AObservable()).subscribe(new Observer<Integer>() {
 @Override
 public void onSubscribe(Disposable d) {

 }

 @Override
 public void onNext(Integer value) {
 System.out.println(value);
 }

 @Override
 public void onError(Throwable e) {

 }

 @Override
 public void onComplete() {
 System.out.println("End!");
 }
});

Observable做了兩件事撤嫩,計(jì)算1+2的結(jié)果偎捎,返回給Observer,Observer接收到結(jié)果后序攘,打印了出來鸭限。在這里,Observable負(fù)責(zé)處理事情两踏,Observer負(fù)責(zé)接收處理結(jié)果,就這么簡(jiǎn)單兜喻。這時(shí)候梦染,你可能開始疑惑,就只能做這么一件事情?

當(dāng)然不是帕识!

Observable進(jìn)化和相互作用

生物的干細(xì)胞能根據(jù)不同的需求泛粹,進(jìn)化成肌細(xì)胞、血紅細(xì)胞肮疗、腦細(xì)胞等等晶姊,Observable也不例外,通過繼承伪货,能實(shí)現(xiàn)不同的功能等Observable们衙,而且RxJava庫已經(jīng)幫你實(shí)現(xiàn)了大量的Observable,你只需要簡(jiǎn)單地調(diào)用就行碱呼。

另外蒙挑,進(jìn)化后的細(xì)胞相互作用后,會(huì)形成各種各樣的生理機(jī)能愚臀,Observable也是如此忆蚀。想想,當(dāng)BObservable給AObservable提供Observer的時(shí)候姑裂,會(huì)發(fā)生什么事馋袜?我們來看一個(gè)有趣的例子。

Observable.just(1, 2, 3,4 )
 .map(new Function<Integer, String>() {
 @Override
 public String apply(Integer integer) throws Exception {
 return "Hello, "+integer;
 }
 })
 .subscribe(new Consumer<String>() {
 @Override
 public void accept(String s) throws Exception {
 System.out.println(s);
 }
 });

just(1, 2, 3,4 )實(shí)現(xiàn)了一個(gè)ObservableFromArray的Observable對(duì)象舶斧,map(...)實(shí)現(xiàn)了一個(gè)ObservableMap的Observable對(duì)象欣鳖,并且在它的subscribeActual里面給ObservableFromArray提供了Observer。這樣子捧毛,你就看到這樣子的場(chǎng)景观堂,ObservableFromArray把1234形成整型數(shù)組,挨個(gè)傳給了ObservableMap呀忧,ObservableMap把整型數(shù)組挨個(gè)轉(zhuǎn)成"Hello, x"后师痕,傳給它的Observer,打印出來而账。

你可以這樣子隨意地拼接能提供Observer的Observable胰坟,形成復(fù)雜的任務(wù)鏈。怎么樣泞辐,是不是很神奇笔横?RxJava可不是僅限于這種簡(jiǎn)單的拼接交互,不過更多的交互得你自己去挖掘了咐吼。

好了吹缔,我們來看一個(gè)更加神奇的進(jìn)化。

進(jìn)一步進(jìn)化

RxJava有兩個(gè)特殊的Observer锯茄,ObservableObserveOn和ObservableSubscribeOn厢塘,里面都包含了Scheduler茶没,用于控制任務(wù)執(zhí)行的線程。

下面晚碾,我們來看看源碼抓半,先看ObservableObserveOn。

public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize)

@Override
protected void subscribeActual(Observer<? super T> observer) {
 if (scheduler instanceof TrampolineScheduler) {
 source.subscribe(observer);
 } else {
 Scheduler.Worker w = scheduler.createWorker();

 source.subscribe(new ObserveOnObserver<T>(observer, w, delayError, bufferSize));
 }
}

ObservableObserveOn實(shí)現(xiàn)了一個(gè)觀察者ObserveOnObserver格嘁,這個(gè)觀察者關(guān)聯(lián)了ObservableObserveOn的觀察者笛求,即subscribeActual傳入?yún)?shù)Observer<? super T> observer,和Scheduler.Worker糕簿,Scheduler.Worker會(huì)把observer的監(jiān)聽函數(shù)放入到Scheduler創(chuàng)建的線程中運(yùn)行探入。

再看ObservableSubscribeOn。

@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);
 }
 }));
}

scheduler直接把 source.subscribe(parent);放到新的線程中執(zhí)行冶伞,實(shí)現(xiàn)對(duì)source的subscribeActual線程控制新症,因?yàn)閟ubcribe會(huì)執(zhí)行subcribeActual。

更多的Observable或者Flowable(支持Backpressure的Observable)响禽,查看源碼徒爹。

一個(gè)使用示例

Observable.just("one", "two", "three", "four", "five")
 .subscribeOn(Schedulers.newThread())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Consumer<String>() {
 @Override
 public void accept(String s) throws Exception {
 System.out.println(s);
 }
 });

這個(gè)示例創(chuàng)建了3個(gè)Observable,just("one", "two", "three", "four", "five")創(chuàng)建了ObservableFromArray芋类,用于把數(shù)組中的子項(xiàng)一個(gè)個(gè)輸出隆嗅,subscribeOn(Schedulers.newThread())創(chuàng)建了ObservableSubscribeOn,用于控制ObservableFromArray的subscribe的執(zhí)行線程侯繁,observeOn(AndroidSchedulers.mainThread())創(chuàng)建了ObservableObserveOn胖喳,用來控制接下來的Observe的監(jiān)聽線程。

看完贮竟,相信大家對(duì) Rxjava的機(jī)制和用法都有了很直觀的認(rèn)識(shí)丽焊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咕别,隨后出現(xiàn)的幾起案子技健,更是在濱河造成了極大的恐慌,老刑警劉巖惰拱,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雌贱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偿短,警方通過查閱死者的電腦和手機(jī)欣孤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昔逗,“玉大人降传,你說我怎么就攤上這事」磁” “怎么了搬瑰?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵款票,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我泽论,道長(zhǎng),這世上最難降的妖魔是什么卡乾? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任翼悴,我火速辦了婚禮,結(jié)果婚禮上幔妨,老公的妹妹穿的比我還像新娘鹦赎。我一直安慰自己,他們只是感情好误堡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布古话。 她就那樣靜靜地躺著,像睡著了一般锁施。 火紅的嫁衣襯著肌膚如雪陪踩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天悉抵,我揣著相機(jī)與錄音肩狂,去河邊找鬼。 笑死姥饰,一個(gè)胖子當(dāng)著我的面吹牛傻谁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播列粪,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼审磁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了岂座?” 一聲冷哼從身側(cè)響起态蒂,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掺逼,沒想到半個(gè)月后吃媒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吕喘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年赘那,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯质。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡募舟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闻察,到底是詐尸還是另有隱情拱礁,我是刑警寧澤琢锋,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站呢灶,受9級(jí)特大地震影響吴超,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸯乃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一鲸阻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缨睡,春花似錦鸟悴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陋守,卻和暖如春震贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅义。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工屏歹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人之碗。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓蝙眶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親褪那。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幽纷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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