RxJava:Subject介紹

這篇文章寫的內(nèi)容是從資料上復(fù)制下來(lái)的管宵。應(yīng)該是RxJava的官方資料翻譯過(guò)來(lái)的文件,忘記原出處了低散。

Subject

Subject可以看成是一個(gè)橋梁或者代理桨昙,在某些ReactiveX實(shí)現(xiàn)中( 如RxJava) ,它同時(shí)充當(dāng)了Observer和Observable的角色措左。因?yàn)樗且粋€(gè)Observer依痊,它可以訂閱一個(gè)或多個(gè)Observable;又因?yàn)樗且粋€(gè)Observable怎披,它可以轉(zhuǎn)發(fā)它收到(Observe)的數(shù)據(jù)胸嘁,也可以發(fā)射新的數(shù)據(jù)。
由于一個(gè)Subject訂閱一個(gè)Observable凉逛,它可以觸發(fā)這個(gè)Observable開始發(fā)射數(shù)據(jù)( 如果那個(gè)Observable是"冷"的--就是說(shuō)性宏,它等待有訂閱才開始發(fā)射數(shù)據(jù)) 。因此有這樣的效果状飞,Subject可以把原來(lái)那個(gè)"冷"的Observable變成"熱"的毫胜。

Subject的種類

針對(duì)不同的場(chǎng)景一共有四種類型的Subject书斜。他們并不是在所有的實(shí)現(xiàn)中全部都存在,而且一些實(shí)現(xiàn)使用其它的命名約定( 例如酵使,在RxScala中Subject被稱作PublishSubject) 荐吉。

AsyncSubject

一個(gè)AsyncSubject只在原始Observable完成后,發(fā)射來(lái)自原始Observable的最后一個(gè)值口渔。( 如果原始Observable沒有發(fā)射任何值样屠,AsyncObject也不發(fā)射任何值) 它會(huì)把這最后一個(gè)值發(fā)射給任何后續(xù)的觀察者。

AsyncSubject

然而缺脉,如果原始的Observable因?yàn)榘l(fā)生了錯(cuò)誤而終止痪欲,AsyncSubject將不會(huì)發(fā)射任何數(shù)據(jù),只是簡(jiǎn)單的向前傳遞這個(gè)錯(cuò)誤通知 枪向。

AsyncSubject錯(cuò)誤

BehaviorSubject

當(dāng)觀察者訂閱BehaviorSubject時(shí)勤揩,它開始發(fā)射原始Observable最近發(fā)射的數(shù)據(jù)( 如果此時(shí)還沒有收到任何數(shù)據(jù)咧党,它會(huì)發(fā)射一個(gè)默認(rèn)值) 秘蛔,然后繼續(xù)發(fā)射其它任何來(lái)自原始Observable的數(shù)據(jù) 。

BehaviorSubject

然而傍衡,如果原始的Observable因?yàn)榘l(fā)生了一個(gè)錯(cuò)誤而終止深员,BehaviorSubject將不會(huì)發(fā)射任何數(shù)據(jù),只是簡(jiǎn)單的向前傳遞這個(gè)錯(cuò)誤通知蛙埂。

BehaviorSubject錯(cuò)誤

PublishSubject

PublishSubject只會(huì)把在訂閱發(fā)生的時(shí)間點(diǎn)之后來(lái)自原始Observable的數(shù)據(jù)發(fā)射給觀察者倦畅。需要注意的是,PublishSubject可能會(huì)一創(chuàng)建完成就立刻開始發(fā)射數(shù)據(jù)( 除非你可以阻止它發(fā)生) 绣的,因此這里有一個(gè)風(fēng)險(xiǎn):在Subject被創(chuàng)建后到有觀察者訂閱它之前這個(gè)時(shí)間段內(nèi)叠赐,一個(gè)或多個(gè)數(shù)據(jù)可能會(huì)丟失。如果要確保來(lái)自原始Observable的所有數(shù)據(jù)都被分發(fā)屡江,你需要這樣做:或者使用Create創(chuàng)建那個(gè)Observable以便手動(dòng)給它引入"冷"Observable的行為( 當(dāng)所有觀察者都已經(jīng)訂閱時(shí)才開始發(fā)射數(shù)據(jù)) 芭概,或者改用ReplaySubject。

PublishSubject

如果原始的Observable因?yàn)榘l(fā)生了一個(gè)錯(cuò)誤而終止惩嘉,PublishSubject將不會(huì)發(fā)射任何數(shù)據(jù)罢洲,只是簡(jiǎn)單的向前傳遞這個(gè)錯(cuò)誤通知。

PublishSubject錯(cuò)誤

ReplaySubject

ReplaySubject會(huì)發(fā)射所有來(lái)自原始Observable的數(shù)據(jù)給觀察者文黎,無(wú)論它們是何時(shí)訂閱的惹苗。也有其它版本的ReplaySubject,在重放緩存增長(zhǎng)到一定大小的時(shí)候或過(guò)了一段時(shí)間后會(huì)丟棄舊的數(shù)據(jù)( 原始Observable發(fā)射的) 耸峭。
如果你把ReplaySubject當(dāng)作一個(gè)觀察者使用桩蓉,注意不要從多個(gè)線程中調(diào)用它的onNext方法( 包括其它的on系列方法),這可能導(dǎo)致同時(shí)(非順序) 調(diào)用劳闹,這會(huì)違反Observable協(xié)議触机,給Subject的結(jié)果增加了不確定性帚戳。

ReplaySubject

RxJava的對(duì)應(yīng)類

假設(shè)你有一個(gè)Subject,你想把它傳遞給其它的代理或者暴露它的Subscriber接口儡首,你可以調(diào)用它的asObservable方法片任,這個(gè)方法返回一個(gè)Observable。具體使用方法可以參考Javadoc文檔蔬胯。

串行化

如果你把 Subject 當(dāng)作一個(gè) Subscriber 使用对供,注意不要從多個(gè)線程中調(diào)用它的onNext方法( 包括其它的on系列方法) ,這可能導(dǎo)致同時(shí)( 非順序) 調(diào)用氛濒,這會(huì)違反Observable協(xié)議产场,給Subject的結(jié)果增加了不確定性。
要避免此類問(wèn)題舞竿,你可以將 Subject 轉(zhuǎn)換為一個(gè) SerializedSubject 京景,類似于這樣:

  mySafeSubject = new SerializedSubject( myUnsafeSubject )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骗奖,隨后出現(xiàn)的幾起案子确徙,更是在濱河造成了極大的恐慌,老刑警劉巖执桌,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鄙皇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仰挣,警方通過(guò)查閱死者的電腦和手機(jī)伴逸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膘壶,“玉大人错蝴,你說(shuō)我怎么就攤上這事⊥前牛” “怎么了顷锰?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畜伐。 經(jīng)常有香客問(wèn)我馍惹,道長(zhǎng),這世上最難降的妖魔是什么玛界? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任万矾,我火速辦了婚禮,結(jié)果婚禮上慎框,老公的妹妹穿的比我還像新娘良狈。我一直安慰自己,他們只是感情好笨枯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布薪丁。 她就那樣靜靜地躺著遇西,像睡著了一般。 火紅的嫁衣襯著肌膚如雪严嗜。 梳的紋絲不亂的頭發(fā)上粱檀,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音漫玄,去河邊找鬼茄蚯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛睦优,可吹牛的內(nèi)容都是我干的渗常。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼汗盘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼皱碘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起隐孽,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤癌椿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缓醋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體如失,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绊诲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年送粱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掂之。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抗俄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出世舰,到底是詐尸還是另有隱情动雹,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布跟压,位于F島的核電站胰蝠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏震蒋。R本人自食惡果不足惜茸塞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望查剖。 院中可真熱鬧钾虐,春花似錦、人聲如沸笋庄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至菌仁,卻和暖如春浩习,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背济丘。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工瘦锹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闪盔。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓弯院,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泪掀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子听绳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的异赫,對(duì)什么是操作椅挣、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,837評(píng)論 0 10
  • 前言 歡迎繼續(xù)收看《我所理解的RxJava--上手其實(shí)很簡(jiǎn)單(二)》,上周出了第一篇塔拳,各位程序猿大大的反應(yīng)還不錯(cuò)鼠证,...
    Weavey閱讀 29,602評(píng)論 35 133
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過(guò)調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,801評(píng)論 0 1
  • 前言 歡迎繼續(xù)收看《RxJava入門與提高》,上周出了第一篇 RxJava入門與提高(1) 靠抑。本文主要給大家補(bǔ)充...
    小玉1991閱讀 927評(píng)論 0 4
  • 發(fā)現(xiàn)兩處喝咖啡的好去處量九! 各種拍! 謝謝給我偷拍了這么多漂亮照片的陳燕小妹妹颂碧! 整個(gè)咖啡屋的角角落落都跑遍了荠列,發(fā)現(xiàn)...
    愚樹心晴閱讀 223評(píng)論 0 0