RxJava系列_01ObservableEmitter

RxJava源碼打算花一周看看, 時間太少了, 不知道一周可以看幾個操作符;

按以下的demo來學習一個RxJava的思路;

demo:

Observable
        .create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                LogUtils.log(getClass(), "threadName:" + Thread.currentThread().getName());
                e.onNext(1);
                e.onComplete();
            }
        })
        .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                LogUtils.log(getClass(), "onSubscribe()");
            }

            @Override
            public void onNext(Integer value) {
                LogUtils.log(getClass(), "onNext()");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.log(getClass(), "onError()");
            }

            @Override
            public void onComplete() {
                LogUtils.log(getClass(), "onComplete()");
            }
        });
  • 打印結(jié)果:
04-23 23:58:14.755 3681-3681/com.test V/AndroidTest: ->onSubscribe()
04-23 23:58:14.755 3681-3681/com.test V/AndroidTest: ->subscribe()
04-23 23:58:14.755 3681-3681/com.test V/AndroidTest: ->onNext()
04-23 23:58:14.755 3681-3681/com.test V/AndroidTest: ->onComplete()
ObservableEmitter.onNext, ObservableEmitter.onComplete到底做了哪些事情?

一、Observable.create:

1.1 Observable.create:
public abstract class Observable<T> implements ObservableSource<T> {
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        return new ObservableCreate<T>(source);
    }
}

public final class ObservableCreate<T> extends Observable<T> {
    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
        this.source = source;
    }
}
  • 創(chuàng)建ObservableCreate實例, ObservableCreate持有ObservableOnSubscribe的引用;

二、Observable.subscribe:

2.1 Observable.subscribe:
public abstract class Observable<T> implements ObservableSource<T> {
    @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    public final void subscribe(Observer<? super T> observer) {
        subscribeActual(observer);
    }
}

public final class ObservableCreate<T> extends Observable<T> {
    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        /**
         * 1. CreateEmitter與Observer互相持有對方的引用, gc如果采用引用計數(shù)算法, 解決不了這種情況;
         * 2. 可以看出來, 被觀察者持有CreateEmitter的引用, CreateEmitter持有觀察者Oberser的引用, 
         *    被觀察者Observable通過CreateEmitter.onXXX方法觸發(fā)觀察者Observer對應(yīng)的onXXX方法;
         */
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        observer.onSubscribe(parent);
        source.subscribe(parent);
    }
}
2.2 CreateEmitter:
static final class CreateEmitter<T>
    extends AtomicReference<Disposable>
    implements ObservableEmitter<T>, Disposable {

    final Observer<? super T> observer;

    CreateEmitter(Observer<? super T> observer) {
        this.observer = observer;
    }
}
操作符簡單調(diào)度的流程
  • demo太短, 可能并不能體現(xiàn)這個操作流程的巧妙之處;
如果換成我們自己來寫觀察者模式, 可能出現(xiàn)的代碼是如下方式:
public void register() {
    Observable observable = new Observable();
    observable.addObserver(new Observer(1));
    observable.addObserver(new Observer(2));
    observable.addObserver(new Observer(3));
}

public void publish() {
    observable.publish(something);
}

public class Observable {
    public void publish(something) {
        if(succ) {...}
        else {...}
    }
}
  • 反觀Rxjava, 沒有那么多套路, 直接一個鏈式調(diào)用搞定;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唐片,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哀九,死亡現(xiàn)場離奇詭異辜昵,居然都是意外死亡荸镊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門堪置,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躬存,“玉大人,你說我怎么就攤上這事晋柱∮殴梗” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵雁竞,是天一觀的道長钦椭。 經(jīng)常有香客問我,道長碑诉,這世上最難降的妖魔是什么彪腔? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮进栽,結(jié)果婚禮上德挣,老公的妹妹穿的比我還像新娘。我一直安慰自己快毛,他們只是感情好格嗅,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唠帝,像睡著了一般屯掖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上襟衰,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天贴铜,我揣著相機與錄音,去河邊找鬼瀑晒。 笑死绍坝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的苔悦。 我是一名探鬼主播轩褐,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼间坐!你這毒婦竟也來了灾挨?” 一聲冷哼從身側(cè)響起邑退,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劳澄,沒想到半個月后地技,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秒拔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年莫矗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砂缩。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡作谚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庵芭,到底是詐尸還是另有隱情妹懒,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布双吆,位于F島的核電站眨唬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏好乐。R本人自食惡果不足惜匾竿,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔚万。 院中可真熱鬧岭妖,春花似錦、人聲如沸反璃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淮蜈。三九已至废离,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礁芦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工悼尾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柿扣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓闺魏,卻偏偏與公主長得像未状,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子析桥,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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