逆推分析RxLifeCycle的實(shí)現(xiàn)原理

本文所涉及到的RxJava操作符:

  1. compose
    你完全可以將apply中的內(nèi)容轉(zhuǎn)移到外部,因?yàn)樗⒉划a(chǎn)生新的上游數(shù)據(jù)源,通常使用它來(lái)包含一系列通用的對(duì)上游數(shù)據(jù)源的處理
  2. takeUntil
    直到某一種條件達(dá)成時(shí)昼接,會(huì)發(fā)送onComplete結(jié)束數(shù)據(jù)流。
  3. combineLatest
    聯(lián)合多個(gè)上游數(shù)據(jù)源施绎,當(dāng)有一個(gè)上游發(fā)送數(shù)據(jù)時(shí),就會(huì)將所有上游所發(fā)送的最新的數(shù)據(jù)聯(lián)合發(fā)送贞绳。
  4. filter
    只有符合過(guò)濾條件的上游數(shù)據(jù)才會(huì)被繼續(xù)發(fā)送
  5. take
    只有前n個(gè)數(shù)量的上游數(shù)據(jù)才會(huì)被發(fā)送
  6. skip
    從n+1個(gè)數(shù)量的上游數(shù)據(jù)開(kāi)始才會(huì)被發(fā)送

直接上代碼,以下代碼為根據(jù)RxLifeCycle的實(shí)現(xiàn)提取出的一個(gè)完整的上游數(shù)據(jù)源到下游數(shù)據(jù)源所經(jīng)過(guò)的歷程
致稀,注釋已經(jīng)寫(xiě)的差不多了

Ob
 .compose(new ObservableTransformer<Object, Object>() {
                            @Override
                            public ObservableSource<Object> apply(Observable<Object> upstream) {
                                //一個(gè)subject既是Observable又是Observer
                                Observable<ActivityEvent> activityEventObservable = Activity.this.provideLifecycleSubject()
                                        .share();

                                return upstream
                                        //takeUntil有兩種實(shí)現(xiàn)
                                        // 一種是:當(dāng)返回true時(shí)冈闭,就發(fā)送onComplete
                                        // 另一種是:當(dāng)(參數(shù)指定的)數(shù)據(jù)源發(fā)射事件時(shí),發(fā)送onComplete
                                        //這里采用第二種抖单,同時(shí)借助filter操作符(控制數(shù)據(jù)源發(fā)送的事件是否會(huì)被攔截)萎攒,實(shí)現(xiàn)當(dāng)?shù)竭_(dá)對(duì)應(yīng)生命周期時(shí)發(fā)送onComplete的效果
                                        .takeUntil(
                                                //每當(dāng)聯(lián)合的數(shù)據(jù)源中遇八,有數(shù)據(jù)源發(fā)送新的事件時(shí),就會(huì)將所有的數(shù)據(jù)源發(fā)送的最新事件合并起來(lái)耍休,發(fā)送一個(gè)新的事件
                                                //這里利用這個(gè)特性刃永,在每個(gè)生命周期方法的最后調(diào)用onNext發(fā)送生命周期事件
                                                Observable.combineLatest(
                                                        //將訂閱時(shí)的生命周期轉(zhuǎn)化為停止發(fā)射事件的生命周期
                                                        activityEventObservable
                                                                .take(1)
                                                                .map(new Function<ActivityEvent, ActivityEvent>() {
                                                                    @Override
                                                                    public ActivityEvent apply(ActivityEvent activityEvent) throws Exception {
                                                                        return activityEvent;
                                                                    }
                                                                }),
                                                        //跳過(guò)訂閱時(shí)的生命周期,當(dāng)后續(xù)生命周期發(fā)送
                                                        activityEventObservable
                                                                .skip(1),
                                                        new BiFunction<ActivityEvent, ActivityEvent, Boolean>() {
                                                            @Override
                                                            public Boolean apply(ActivityEvent bindUntilEvent, ActivityEvent lifecycleEvent) throws Exception {
                                                                return lifecycleEvent.equals(bindUntilEvent);
                                                            }
                                                        })
                                                        //是否攔截事件
                                                        .filter(b -> b));
                            }
                        })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羊精,一起剝皮案震驚了整個(gè)濱河市斯够,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喧锦,老刑警劉巖读规,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燃少,居然都是意外死亡束亏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)阵具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碍遍,“玉大人,你說(shuō)我怎么就攤上這事阳液∨戮矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵趁舀,是天一觀的道長(zhǎng)赖捌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)矮烹,這世上最難降的妖魔是什么越庇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮奉狈,結(jié)果婚禮上卤唉,老公的妹妹穿的比我還像新娘。我一直安慰自己仁期,他們只是感情好桑驱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著跛蛋,像睡著了一般熬的。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赊级,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天押框,我揣著相機(jī)與錄音,去河邊找鬼理逊。 笑死橡伞,一個(gè)胖子當(dāng)著我的面吹牛盒揉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兑徘,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刚盈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挂脑?” 一聲冷哼從身側(cè)響起藕漱,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎最域,沒(méi)想到半個(gè)月后谴分,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镀脂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年牺蹄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄翅。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沙兰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翘魄,到底是詐尸還是另有隱情鼎天,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布暑竟,位于F島的核電站斋射,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏但荤。R本人自食惡果不足惜罗岖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腹躁。 院中可真熱鬧桑包,春花似錦、人聲如沸纺非。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烧颖。三九已至弱左,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炕淮,已是汗流浹背科贬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榜掌。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乘综,于是被迫代替她去往敵國(guó)和親憎账。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 前言 隨著RxJava及RxAndroid的逐漸推廣卡辰,使用者越來(lái)越多胞皱,但是有一個(gè)問(wèn)題,RxJava的使用不當(dāng)極有可...
    卻把清梅嗅閱讀 28,502評(píng)論 8 65
  • 作者介紹馮宇飛 九妈,現(xiàn)任人人車(chē)Android客戶(hù)端架構(gòu)師反砌。 本文回顧總結(jié)了人人車(chē)公司Android客戶(hù)端的架構(gòu)演進(jìn)歷...
    passiontim閱讀 1,545評(píng)論 0 9
  • 少女想著一位長(zhǎng)相帥氣的男孩走了,緊接著一位很美麗的女孩也走了過(guò)來(lái)萌朱,初次見(jiàn)面我叫李雪桃你好我是李小狼的妹妹宴树,梅鈴姐姐...
    青檸味閱讀 322評(píng)論 0 0
  • 兩腿一蹬醉,緣是阿郎現(xiàn) 人已封山去晶疼,卿艷舉未改酒贬, 林間寧為猴,人里當(dāng)樂(lè)狗
    解毒丸_d04b閱讀 226評(píng)論 0 3
  • 高人自比云間鶴翠霍, 矮蛙更知井里熱锭吨。 不如隨繩爬上來(lái), 仰仰藍(lán)天看看河寒匙。
    云逸1108閱讀 121評(píng)論 0 3