我和rx的對(duì)話來繼續(xù)了解冷觀察者和熱觀察者
wow我們又多了一天來學(xué)習(xí)新的知識(shí)這真的很棒诵原。
hello 伙伴們穗泵。希望你們能做的更好柴灯。這是我們的第六部分滑负。在這部分我將繼續(xù)和rx扯淡
還有一部分重要的事情。夏天和冬天Observable?意味著“冷“至会,“熱”离咐。
簡介
這并不是這一部分的介紹因?yàn)樗皇巧弦徊糠值难由臁T陂_始之前奉件,我們將對(duì)最后一部分進(jìn)行一些修改宵蛀,在最后部分。我們將遇到一個(gè)可觀察rx县貌,它將給我們一些建議去學(xué)習(xí)rx术陶,之后他將分享一些方法,怎么去創(chuàng)建被觀察者并且告訴我們什么事“冷 ”“熱”觀察者煤痕。
rx:雖然有很多但是我能但是關(guān)于兩種被觀察者我能做出解釋梧宫。一種稱之為冷被觀察者另一種被叫做熱觀察者接谨,一段時(shí)間之后開發(fā)者們習(xí)慣了這些“冷 熱”這些都是很簡單的概念,但是我將通過一些幼稚的例子來講解這些概念塘匣,因此你們將會(huì)有一種理念脓豪,并且我將告訴你們?nèi)绾卧诖a中使用這種理念
me:當(dāng)然。我會(huì)試著在你之前去嘗試馆铁。讓你來告訴我這是對(duì)的還是錯(cuò)的跑揉。
rx: 哈哈。? 你知道現(xiàn)在有多少人了解那些銷售人員用什么口號(hào)在市場(chǎng) 商店前
來吸引人們
me:我想是的埠巨,大部分亞洲國家都不了解這種概念历谍,比如巴基斯坦,印度辣垒。你能不能試著再舉一些其他的例子望侈。所以全世界的人都能輕易地抓住這個(gè)概念。
rx: 小case.那么有多少人了解咖啡廳勋桶?
me:我認(rèn)為所有人吧
rx: good脱衙,那么現(xiàn)在有兩杯咖啡廳。一家叫做熱音樂咖啡廳一家叫做冷音樂咖啡廳任何人都可以去冷音樂咖啡廳買到咖啡并且做到任何地方例驹。在咖啡廳中有1款個(gè)耳機(jī)能夠讓每一個(gè)做的地方人都能聽到荤胁,他們有三個(gè)劇本盆驹,這款智能耳機(jī)是每一個(gè)帶上的人都從第一個(gè)開始播放。如果換了一個(gè)人戴耳機(jī)那么也將從頭播放辫封。如果摘掉耳機(jī)那么將停止秸讹。
在熱音樂咖啡館里弧可,他們有一個(gè)完整的音樂系統(tǒng)裁良。當(dāng)你走進(jìn)那家咖啡館時(shí)牧抵,你會(huì)開始聽詩,因?yàn)樗麄冇幸粋€(gè)非常好的音樂系統(tǒng)秋柄,有非常大的揚(yáng)聲器懦傍。他們也有無限的詩歌持寄,作為第一個(gè)咖啡館的男孩打開咖啡館模庐,他/她開始了這個(gè)系統(tǒng)掂碱。所以系統(tǒng)是獨(dú)立于咖啡館的客戶披诗,任何一個(gè)人進(jìn)入咖啡館宪摧,他都會(huì)從那個(gè)時(shí)間開始聽詩,在他進(jìn)入咖啡館之前颅崩,他不知道已經(jīng)播放了多少首詩几于。在觀察中,這是相同的概念挨摸。
就拿冷音樂咖啡廳來說吧孩革。冷觀察者總是很懶的。就像你通過fromArray創(chuàng)建一個(gè)被觀察者或者其他方法得运,這就像這個(gè)耳機(jī)膝蜈,當(dāng)你訂閱的時(shí)候,你就會(huì)得到他們的數(shù)據(jù)熔掺,就像任何人帶著都會(huì)開始播放詩一樣饱搏。 現(xiàn)在觀察者取消關(guān)注被觀察著了。 你不會(huì)得到任何數(shù)據(jù)就像關(guān)機(jī)關(guān)閉了一樣
最后很重要的一點(diǎn)置逻。冷咖啡館有很多耳機(jī)推沸,但是每個(gè)耳機(jī)的都是在穿戴的時(shí)候開發(fā)播放。如果一個(gè)人在聽到第二首的時(shí)候券坞,另一個(gè)人戴上耳機(jī) 那么他將從第一手詩開始播放鬓催,我想表達(dá)的就是每個(gè)人都有一個(gè)獨(dú)立的歌單,同理我們又三個(gè)訂閱者恨锚、他們都訂閱了一個(gè)冷的被觀察者宇驾,他們將會(huì)得到一個(gè)獨(dú)立的數(shù)據(jù)流 ,這意味著被觀察者將會(huì)調(diào)用三次onnext猴伶,當(dāng)訂閱這訂閱的時(shí)候课舍,通過這種方式,我們可以說冷的被觀察者依賴于用戶就想耳機(jī)一樣
現(xiàn)在他挎,“熱觀察者”就像一個(gè)熱咖啡咖啡館的音樂系統(tǒng)筝尾。一旦開了咖啡館,音樂系統(tǒng)就開始播放詩歌办桨,照顧任何一個(gè)人筹淫。它總是演奏詩歌,任何人到來呢撞,他會(huì)從那一刻開始聽那首詩贸街。同樣的情況也發(fā)生在熱點(diǎn)觀察中庵寞,一旦它們被創(chuàng)建并開始發(fā)送數(shù)據(jù),任何訂閱用戶都將訂閱這個(gè)可觀察的數(shù)據(jù)并且從那個(gè)特定的時(shí)間點(diǎn)開始獲取數(shù)據(jù)他將永遠(yuǎn)不會(huì)得到舊的值薛匪。熱觀察者是獨(dú)立于用戶的,他們不關(guān)心任何以前的數(shù)據(jù)脓鹃。任何用戶訂閱的任何時(shí)候都將從這一點(diǎn)開始獲取數(shù)據(jù)逸尖。我想我會(huì)在代碼中使用同樣的例子,之后我會(huì)給你們一些實(shí)際的例子瘸右。
public class HotVsCold {
public static void main(String[] args) throws InterruptedException {
List poemsPlayList = Arrays.asList("Poem 1", "Poem 2", "Poem 3");
Observable coldMusicCoffeCafe = Observable.fromArray(poemsPlayList);
Consumer client1 = poem-> System.out.println(poem);
Consumer client2 = poem-> System.out.println(poem);
Consumer client3 = poem-> System.out.println(poem);
Consumer client4 = poem-> System.out.println(poem);
coldMusicCoffeCafe.subscribe(client1);
coldMusicCoffeCafe.subscribe(client2);
System.out.println(System.currentTimeMillis());
Thread.sleep(2000);
System.out.println(System.currentTimeMillis());
coldMusicCoffeCafe.subscribe(client3);
coldMusicCoffeCafe.subscribe(client4);
}
}
這是代碼中的一個(gè)非常簡單的例子娇跟。我有4個(gè)客戶,我有一個(gè)播放列表太颤,我把它變成冷音樂咖啡的被觀察者苞俘。后,前兩個(gè)客戶與被觀察到聯(lián)系后來我有一個(gè)2秒等待,然后3和4端訂閱冷可觀測(cè)的,最后當(dāng)我們看到輸出我們可以很容易地看到所有用戶或客戶將詩歌從開始到結(jié)束。
Output:
[Poem 1, Poem 2, Poem 3]
[Poem 1, Poem 2, Poem 3]
1494142518697
1494142520701
[Poem 1, Poem 2, Poem 3]
[Poem 1, Poem 2, Poem 3]
熱被觀察者
public static void main(String[] args) throws InterruptedException {
Observable hotMusicCoffeeCafe = Observable.interval(1000, TimeUnit.MILLISECONDS);
ConnectableObservable connectableObservable = hotMusicCoffeeCafe.publish();
connectableObservable.connect(); //? Cafe open on this line and cafe boy start the systemConsumer client1 = poem-> System.out.println("Client 1 poem"+poem);
Consumer client2 = poem-> System.out.println("Client 2 poem"+poem);
Consumer client3 = poem-> System.out.println("Client 3 poem"+poem);
Consumer client4 = poem-> System.out.println("Client 4 poem"+poem);
Thread.sleep(2000); // After two poems already played client 1 enter. So he should listens from poem 2.
connectableObservable.subscribe(client1);
Thread.sleep(1000); // Client two should start listening poem 3
connectableObservable.subscribe(client2);
Thread.sleep(4000); // Client 3 and 4 enter will start from poem 9.
connectableObservable.subscribe(client3);
connectableObservable.subscribe(client4);
while (true);
}
熱音樂咖啡館開著龄章,咖啡館啟動(dòng)了這個(gè)系統(tǒng)吃谣。詩歌開始播放,就像我們所說的連接方法一樣做裙。暫時(shí)不要把注意力集中在連接上岗憋,只試著抓住這個(gè)概念。在兩首詩或幾秒鐘后锚贱,第一個(gè)顧客進(jìn)入咖啡館仔戈,他就會(huì)開始聆聽第二首詩。然后下一個(gè)顧客在1秒后進(jìn)入拧廊,所以他開始聽第三首詩监徘。后來的顧客在4秒的顧客2之后進(jìn)入了咖啡館。現(xiàn)在他們開始聽第9首詩了吧碾。您可以看到凰盔,這種熱的可觀察性與訂閱者無關(guān)。一旦他開始發(fā)送數(shù)據(jù)滤港,他并不關(guān)心任何一個(gè)人是否訂閱廊蜒。另一方面,所有訂閱用戶將從他們訂閱的時(shí)間獲得數(shù)據(jù)溅漾,他們永遠(yuǎn)不會(huì)得到已經(jīng)發(fā)出的歷史或事件山叮。
現(xiàn)在我有了一種感覺,你可以理解“熱”和“冷”的概念√砺模現(xiàn)在是時(shí)候看看如何用點(diǎn)的形式來創(chuàng)造這些可見的東西了屁倔。
1cold observable
~所有的隱式被觀察者都是冷被觀察者,也就是說我們使用creat()或者fromarray()或者其他方式創(chuàng)建的被觀察者的時(shí)候他都是冷被觀察者
~當(dāng)訂閱冷被觀察這的訂閱者 他們總是會(huì)得到完整的獨(dú)立的數(shù)據(jù)流
~沒有訂閱者去訂閱冷被觀察者的時(shí)候 暮胧,他們就什么都做不了锐借。他們很懶
2Hotobservable
~熱被觀察者一旦創(chuàng)建他們就開始發(fā)送數(shù)據(jù)问麸。而并不關(guān)心訂閱者的情況
~所有的訂閱者在訂閱熱被觀察者的時(shí)候如果在一個(gè)特定的時(shí)間段(相同)那么他們將獲取相同的數(shù)據(jù)
me:額 額 額? 好。那么你能告訴我怎么去吧一個(gè)冷被觀察者轉(zhuǎn)化成一個(gè)熱被觀察者嗎
rx: 當(dāng)然钞翔。這真的很簡單
List integers = new ArrayList<>();
Observable.range(0, 10000)
.subscribe(count -> integers.add(count));
Observable>listObservable= Observable.fromArray(integers);
來看上面這段例子严卖,listObservable? 是一個(gè)冷被觀察者。? 讓我們來看一下他們是怎么轉(zhuǎn)化的
Observable> listObservable = Observable.fromArray(integers);
ConnectableObservableconnectableObservable= listObservable.publish();
me:在上面的代碼中我們通過publish來吧我們的冷被觀察者轉(zhuǎn)化成為熱被觀察者布轿,所以我們可以這么說哮笆。所有的冷都可以通過publish方法轉(zhuǎn)化為熱并且他總是和你的被觀察者聯(lián)系起來,但是現(xiàn)在它并沒有發(fā)送數(shù)據(jù) 汰扭,這是一個(gè)棘手的問題稠肘,任何被觀察者我們都能調(diào)用publish
它意味著訂閱者在相同的時(shí)間段訂閱這個(gè)被觀察者 那么他們將得到相同的數(shù)據(jù)。從他們訂閱的時(shí)間段開始算萝毛。 正如我們知道的在熱音樂咖啡廳中 他們想獲得相同的數(shù)據(jù)项阴。只有他們?cè)谙嗤臅r(shí)間段開始訂閱才可以“拾……現(xiàn)在有趣的一點(diǎn)是环揽,如果有很多訂閱用戶訂閱了連接表,他們就什么也得不到色查。也許你們會(huì)感到困惑薯演。基本上有兩件事秧了。當(dāng)我將調(diào)用publish()時(shí)跨扮,它的意思是,這個(gè)可觀察的數(shù)據(jù)將會(huì)發(fā)出一個(gè)單獨(dú)的數(shù)據(jù)验毡,或者這個(gè)可觀察到的數(shù)據(jù)來源是向所有用戶發(fā)送數(shù)據(jù)的單一數(shù)據(jù)源衡创,但是要啟動(dòng)數(shù)據(jù),我需要調(diào)用connect()方法晶通,如下所示璃氢。
Observable> listObservable = Observable.fromArray(integers);
ConnectableObservable connectableObservable = listObservable.publish();
connectableObservable.connect();
現(xiàn)在看 這個(gè)真的很簡單 記著publish將吧冷的轉(zhuǎn)化成熱的 但是并沒有發(fā)送數(shù)據(jù),為了發(fā)射數(shù)據(jù)我們需要調(diào)用connect()方法狮辽。當(dāng)我轉(zhuǎn)化完的數(shù)據(jù)調(diào)用connect一也,將會(huì)在沒有任何訂閱的情況下開始發(fā)送數(shù)據(jù),也許有上千的訂閱者喉脖,現(xiàn)在還有一起其他的的方法真的很有用 refCount(), share(), replay() 椰苟,但是我將停下來、我將做一個(gè)更好的例子讓你有一個(gè)回顧真的了解這個(gè)概念树叽。
me: oh man. 這真的很長很繁瑣舆蝴。但是真的很簡單。
rx: 哈哈哈、洁仗。其實(shí)我還沒說什么层皱。 那些只是用一種很簡單的方式讓每個(gè)人都理解這個(gè)概念,那就是真的事一個(gè)很簡單的話題
me:阿拉我贊美你赠潦。你說的太對(duì)了〗信郑現(xiàn)在我用一個(gè)例子來更準(zhǔn)確的理解這個(gè)概念
如下所示 我們有一個(gè)被觀察者
Observable just = Observable.just("Hello guys");
現(xiàn)在兩個(gè)被不同的訂閱者
public class HotVsCold {
public static void main(String[] args) {
Observable just = Observable.just("Hello guys");
just.subscribe(s-> System.out.println(s));
just.subscribe(s-> System.out.println(s));
}
}
Output:
Hello guys
Hello guys
現(xiàn)在我有一個(gè)問題 這個(gè)Observable 是冷? 還是熱她奥?我知道你想說沒有調(diào)用publish 所以他是冷的臭家, 有些時(shí)間 我的observable 是從第三方的庫產(chǎn)生的 我并不了解這個(gè)observable 現(xiàn)在我要舉一個(gè)新的例子,因?yàn)楹芏嗍虑闀?huì)對(duì)每個(gè)人都很清楚方淤。
public static void main(String[] args) {
Random random = new Random();
Observable just = Observable.create(source->source.onNext(random.nextInt()));
just.subscribe(s-> System.out.println(s));
just.subscribe(s-> System.out.println(s));
}
這里我有一個(gè)隨機(jī)值,所以是時(shí)候檢查程序輸出蹄殃,討論它是冷的還是熱的?
Output:
1531768121
607951518
所以兩個(gè)值都是不同的携茂。它的意思是,這是冷被觀察者诅岩,因?yàn)槊看蔚玫揭粋€(gè)新的值讳苦,根據(jù)對(duì)冷被觀察者定義,它們從不共享數(shù)據(jù)吩谦。每次他們生成一個(gè)新的或新的數(shù)據(jù)鸳谜,或者用簡單的單詞onNext()方法調(diào)用兩個(gè)不同的訂閱者。
現(xiàn)在讓我們把冷轉(zhuǎn)化成熱
public static void main(String[] args) {
Random random = new Random();
Observable just = Observable.create(source->source.onNext(random.nextInt()));ConnectableObservablepublish=just.publish();publish.subscribe(s-> System.out.println(s));
publish.subscribe(s-> System.out.println(s));
publish.connect();}
Output:
1926621976
1926621976
這一次式廷,我在兩個(gè)訂閱者中都得到了相同的數(shù)據(jù)咐扭。它的意思是hotObservable,因?yàn)闊嵊^測(cè)總是從單個(gè)源發(fā)送數(shù)據(jù)滑废,或者簡單地說蝗肪,我們從onNext()方法的一次調(diào)用中獲得了數(shù)據(jù)。接下來蠕趁,我將解釋發(fā)布()和connect()方法的調(diào)用薛闪。
當(dāng)我調(diào)用publish 方法的時(shí)候。它意味著我這個(gè)被觀察者獨(dú)立于訂閱者并且對(duì)于訂閱者來說發(fā)射的是相同的數(shù)據(jù)俺陋,簡單的說 Hot Observable? 將把onnext這個(gè)相同的方法推送給所有的訂閱者豁延,也許這讓你有一點(diǎn)困惑,在訂閱著訂閱了之后我調(diào)用了connect(),我想像你們展示腊状,Hot Observable是獨(dú)立的诱咏,數(shù)據(jù)的發(fā)射有onnext的一個(gè)調(diào)用來完成。我們知道Hot Observable在我們調(diào)用connect的時(shí)候數(shù)據(jù)開始發(fā)射寿酌,所以我們訂閱兩個(gè)訂閱者胰苏,然后調(diào)用connect方法。這兩種都可以得到相同的數(shù)據(jù) 下面我在舉一個(gè)例子
Random random = new Random();
Observable just =Observable.create(source->source.onNext(random.nextInt()));ConnectableObservablepublish= just.publish();publish.connect();publish.subscribe(s-> System.out.println(s));
publish.subscribe(s-> System.out.println(s));
這里僅僅有一處不同,我們來試試他輸出的是什么
沒錯(cuò)是空的硕并,困惑嗎法焰? 我來講解一下。正如你看到的我創(chuàng)建了一個(gè)我吧一個(gè)隨機(jī)值創(chuàng)建成Observable倔毙,它只調(diào)用一次埃仪。在我創(chuàng)建的過程中,我通過調(diào)用publish()方法將這種冷轉(zhuǎn)換為熱觀察陕赃。轉(zhuǎn)換之后卵蛉,我調(diào)用了connect()方法。因?yàn)檫@是一個(gè)熱觀察么库,我們知道它是獨(dú)立于訂戶的所以它開始發(fā)射隨機(jī)數(shù)我們知道這只會(huì)產(chǎn)生一個(gè)隨機(jī)數(shù)傻丝。連接()我們的訂閱者,訂閱但那時(shí)我們沒有得到任何數(shù)據(jù)诉儒,因?yàn)闊嵊^察已經(jīng)釋放出一個(gè)值葡缰。我認(rèn)為事情對(duì)每個(gè)人都很清楚。現(xiàn)在我們可以在熱觀察發(fā)射中加入log忱反。所以我們可以確認(rèn)泛释,我說的是真的。
public static void main(String[] args) {
Random random = new Random();
Observable just = Observable.create(source -> {
int value = random.nextInt();System.out.println("Emitted data: " + value);source.onNext(value);
}
);
ConnectableObservable publish = just.publish();
publish.connect();
publish.subscribe(s -> System.out.println(s));
publish.subscribe(s -> System.out.println(s));
}
Output:
Emitted data: -690044789
現(xiàn)在正如你看的HotObservable?在調(diào)用connect之后開始發(fā)送數(shù)據(jù)温算,訂閱的過程在這之后怜校,這就是我們?yōu)槭裁传@取的是空。注竿、
在下一步之前我們要溫習(xí)一下
1茄茁。所有的observables都是隱式的冷觀察。
2 想要把冷轉(zhuǎn)化為熱蔓搞。我們要調(diào)用publish方法胰丁。它返回給我們一個(gè)被訂閱者聯(lián)系單。這也是一個(gè)熱observables喂分,但卻沒有開始發(fā)射數(shù)據(jù)锦庸。
3調(diào)用connect開始發(fā)射數(shù)據(jù)
rx:打擾了,在下一個(gè)級(jí)別前蒲祈。你試著寫一段代碼
me: 當(dāng)然
public static void main(String[] args) throws InterruptedException {
Random random = new Random();Observable just = Observable.create(source -> {Observable.interval(1000, TimeUnit.MILLISECONDS).subscribe(aLong -> {int value = random.nextInt();System.out.println("Emitted data: " + value);source.onNext(value);});}); // Simple same Observable which we are using only I added a one thing now this will produce data after every one second.ConnectableObservable publish = just.publish();
publish.connect();Thread.sleep(2000); // Hot observable start emitting data and our new subscribers will subscribe after 2 second.publish.subscribe(s -> System.out.println(s));
publish.subscribe(s -> System.out.println(s));
while (true);
}Output:
Emitted data: -918083931
Emitted data: 697720136
Emitted data: 416474929
416474929
416474929
Emitted data: -930074666
-930074666
-930074666
Emitted data: 1694552310
1694552310
1694552310
Emitted data: -61106201
-61106201
-61106201
現(xiàn)在我們可以很簡單的看出上面的輸出甘萧、
根據(jù)我們一開始的討論, Hot Observable? 是不停工作的梆掸。 Hot Observable? 發(fā)射數(shù)據(jù)扬卷,雖然沒有訂閱者 但是我們還是得到三個(gè)值,
在2秒之后酸钦,我們訂閱了兩個(gè)新的訂閱者怪得,他們開始獲得新的數(shù)據(jù)值,并且它們都得到了相同的值。
是時(shí)候把我們的這個(gè)概念帶到下一個(gè)層次了徒恋。因?yàn)槲覀円呀?jīng)抓住了冷和Hot Observables的概念蚕断。對(duì)于下一個(gè)熱點(diǎn),我將用場(chǎng)景的形式來解釋入挣。
場(chǎng)景1
我想要一個(gè) Hot Observable亿乳,并且訂閱 以前所有的值,這個(gè)Hot Observable早就發(fā)射的值還有新的值應(yīng)該同步径筏。為了解決這個(gè)問題我們有一個(gè)非常簡單的方法葛假。這叫做replay()。我們只需要調(diào)用那個(gè)方法滋恬。
public static void main(String[] args) throws InterruptedException {
Random random = new Random();
Observable just = Observable.create(
source -> {
Observable.interval(500, TimeUnit.MILLISECONDS)
.subscribe(aLong -> {
int value = random.nextInt();
System.out.println("Emitted data: " + value);
source.onNext(value);
});
}
);
ConnectableObservable publish =just.replay();publish.connect();Thread.sleep(2000);
publish.subscribe(s -> System.out.println("Subscriber 1: "+s));
publish.subscribe(s -> System.out.println("Subscriber 2: "+s));
while (true);
}
Output:
Emitted data: -1320694608
Emitted data: -1198449126
Emitted data: -1728414877
Emitted data: -498499026
Subscriber 1: -1320694608
Subscriber 1: -1198449126
Subscriber 1: -1728414877
Subscriber 1: -498499026
Subscriber 2: -1320694608
Subscriber 2: -1198449126
Subscriber 2: -1728414877
Subscriber 2: -498499026
Emitted data: -1096683631
Subscriber 1: -1096683631
Subscriber 2: -1096683631
Emitted data: -268791291
Subscriber 1: -268791291
Subscriber 2: -268791291
如果您在這里查看我們的輸出和代碼聊训。您可以很容易地在熱觀察中輕松地獲得replay()的概念。首先恢氯,我創(chuàng)建了一個(gè)可以在創(chuàng)建后啟動(dòng)數(shù)據(jù)的熱觀察魔眨。然后在2秒鐘之后,我們的第一個(gè)和第二個(gè)訂閱用戶就會(huì)訂閱那個(gè)熱點(diǎn)酿雪,但是在那個(gè)時(shí)候,熱觀測(cè)已經(jīng)發(fā)出了4個(gè)值侄刽。你可以看到指黎,在輸出中,我們的訂閱者首先獲得已經(jīng)發(fā)射的值州丹,然后他們與可觀測(cè)的數(shù)據(jù)發(fā)射同步
2場(chǎng)景
我想要一個(gè)Hot Observable醋安,當(dāng)?shù)谝粋€(gè)訂閱者訂閱了這個(gè)Hot Observable的時(shí)候才開始數(shù)據(jù)發(fā)射,當(dāng)所有的訂閱者都不訂閱那個(gè)Hot Observable的時(shí)候墓毒,應(yīng)該停止吓揪。
這次又是挺簡單的
public static void main(String[] args) throws InterruptedException {
Observable observable = Observable.interval(500, TimeUnit.MILLISECONDS).publish().refCount();
Consumer firstSubscriber = s -> System.out.println("Subscriber 1: "+s);
Consumer secondSubscriber = s -> System.out.println("Subscriber 2: "+s);Disposable subscribe1 = observable.subscribe(firstSubscriber);Disposable subscribe2 = observable.subscribe(secondSubscriber);Thread.sleep(2000);subscribe1.dispose();Thread.sleep(2000);subscribe2.dispose();Consumer thirdSubscriber = s -> System.out.println("Subscriber 3: "+s);Disposable subscribe3 = observable.subscribe(thirdSubscriber);Thread.sleep(2000);subscribe3.dispose();while (true);
}
Output:
Subscriber 1: 0
Subscriber 2: 0
Subscriber 1: 1
Subscriber 2: 1
Subscriber 1: 2
Subscriber 2: 2
Subscriber 1: 3
Subscriber 2: 3
Subscriber 2: 4
Subscriber 2: 5
Subscriber 2: 6
Subscriber 2: 7
Subscriber 3: 0
Subscriber 3: 1
Subscriber 3: 2
首先也是最重要的一點(diǎn)這是一個(gè)Hot Observable,但只有當(dāng)?shù)谝粋€(gè)用戶訂閱了這個(gè)Observable數(shù)據(jù)時(shí)才會(huì)開始數(shù)據(jù)發(fā)射所计,所有的用戶都沒有訂閱這個(gè)Observable柠辞,將停止數(shù)據(jù)發(fā)射
正如你在上面的輸出中看到的。當(dāng)最初的兩個(gè)訂閱者訂閱了Hot Observable數(shù)據(jù)發(fā)射時(shí)主胧,后來有一個(gè)訂閱者取消訂閱叭首,但Hot Observable并沒有停止,因?yàn)檫€有一個(gè)訂閱者踪栋,但后來第二個(gè)也取消了如此熱的Hot Observable停止數(shù)據(jù)發(fā)射焙格。在2秒后,第三個(gè)用戶訂閱了同樣的Hot Observable夷都,但這次Hot Observable又開始了數(shù)據(jù)發(fā)射眷唉,再次取消后就在此停止
me: wow wow? 你用了一個(gè)很好demo 讓我印象深刻
rx :Thanks Observable.
Observable: 那你現(xiàn)在還沒有其他的問題。沒有就滾
Me: ("▔□▔) 你能不能告訴我Subject 的概念 還有不同的類型像Publish Behaviour 等
Observable:嗯。在這個(gè)概念之前我有一種感覺冬阳。我應(yīng)該告訴您關(guān)于ObservableAPI的情況以及它們是如何工作的蛤虐,以及如何使用Lambda或函數(shù)接口,而不需要使用完整的Observable者界面摩泪。你認(rèn)為什么?
Me: 沒錯(cuò)笆焰。我賴定你了
伙伴們。這一章節(jié)很長见坑。但是我要在這里停下了嚷掠。下次在見