冷熱觀測資料
可觀察量大致分為 Hot
或 Cold
,具體取決於它們的排放行為。
Cold Observable
是根據請求(訂閱)開始發出的,而 Hot Observable
是不管訂閱而發出的 Hot Observable
。
冷可觀察
/* Demonstration of a Cold Observable */
Observable<Long> cold = Observable.interval(500, TimeUnit.MILLISECONDS); // emits a long every 500 milli seconds
cold.subscribe(l -> System.out.println("sub1, " + l)); // subscriber1
Thread.sleep(1000); // interval between the two subscribes
cold.subscribe(l -> System.out.println("sub2, " + l)); // subscriber2
上面程式碼的輸出看起來像(可能會有所不同):
sub1, 0 -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 0 -> subscriber2 starts
sub1, 3
sub2, 1
sub1, 4
sub2, 2
請注意,即使 sub2
啟動較晚,它也會從一開始就接收值。總而言之,Cold Observable
僅在需要時發出物品。多個請求啟動多個管道。
熱觀察
注意:Hot observables 會發出獨立於各個訂閱的值。他們有自己的時間表,無論有人在聽,都會發生事件。
Cold Observale
可以通過簡單的 publish
轉換為 Hot Observable
。
Observable.interval(500, TimeUnit.MILLISECONDS)
.publish(); // publish converts cold to hot
publish
返回一個 ConnectableObservable
,它增加了與 observable 連線和斷開**連線的功能。
ConnectableObservable<Long> hot = Observable
.interval(500, TimeUnit.MILLISECONDS)
.publish(); // returns ConnectableObservable
hot.connect(); // connect to subscribe
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
以上輸出:
sub1, 0 -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 2 -> subscriber2 starts
sub1, 3
sub2, 3
請注意,即使 sub2
開始觀察較晚,它也與 sub1
同步。
斷開連線有點複雜! 斷開發生在 Subscription
而不是 Observable
。
ConnectableObservable<Long> hot = Observable
.interval(500, TimeUnit.MILLISECONDS)
.publish(); // same as above
Subscription subscription = hot.connect(); // connect returns a subscription object, which we store for further use
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
Thread.sleep(1000);
subscription.unsubscribe(); // disconnect, or unsubscribe from subscription
System.out.println("reconnecting");
/* reconnect and redo */
subscription = hot.connect();
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
Thread.sleep(1000);
subscription.unsubscribe();
以上產生:
sub1, 0 -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 2 -> subscriber2 starts
sub1, 3
sub2, 3
reconnecting -> reconnect after unsubscribe
sub1, 0
...
斷開連線後,Observable
基本上終止並在新增新訂閱時重新啟動。
Hot Observable
可用於建立 EventBus
。這種 EventBuses 通常很輕且超快。RxBus 的唯一缺點是必須手動實現所有事件並將其傳遞給匯流排。