HOT Observable | Cold Observable | |
無論有沒有觀察者進行訂閱,事件始終都會發生 | 只有觀察者訂閱了,纔開始執行發射數據流的的帶啊嗎 | |
關係 | 與訂閱者們的關係是一對多的關係,可以與多個訂閱者共享信息 | 與Observer只能是一對一的關係,當有多個不同訂閱者時,消息是重新完整發送到 |
獨立性 | 當有多個Observer的事件,事件是不獨立 | 當有多個Observer的事件,事件是獨立的 |
just、create、range、fromXXX等操作符都能生成 |
舉例:
把一個Hot Observable 想象成一個廣播電臺,所有在此刻收聽的聽衆都會聽到同一首歌
而Cold Observable 一張音樂CD,人們可以獨立購買並聽取它
Consumer<Long> subscriber1 = new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println("subcriber1:"+aLong);
}
};
Consumer<Long> subscriber2 = new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println("subcriber2:"+aLong);
}
};
Observable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
@Override
public void subscribe(ObservableEmitter<Long> emitter) throws Exception {
//創建一個按照給定的時間間隔發射整數列的Observable
Observable.interval(10, TimeUnit.MILLISECONDS, Schedulers.computation()).take(Integer.MAX_VALUE).subscribe(emitter::onNext);
}
}).observeOn(Schedulers.newThread());
observable.subscribe(subscriber1);
observable.subscribe(subscriber2);
try {
Thread.sleep(100L);
}catch (InterruptedException e)
{
e.printStackTrace();
}
執行結果:
2019-12-22 14:42:10.060 6084-6128/com.example.asynctask I/System.out: subcriber2:0
2019-12-22 14:42:10.060 6084-6129/com.example.asynctask I/System.out: subcriber1:0
2019-12-22 14:42:10.064 6084-6129/com.example.asynctask I/System.out: subcriber1:1
2019-12-22 14:42:10.065 6084-6128/com.example.asynctask I/System.out: subcriber2:1
2019-12-22 14:42:10.073 6084-6129/com.example.asynctask I/System.out: subcriber1:2
2019-12-22 14:42:10.074 6084-6128/com.example.asynctask I/System.out: subcriber2:2
2019-12-22 14:42:10.083 6084-6129/com.example.asynctask I/System.out: subcriber1:3
2019-12-22 14:42:10.084 6084-6128/com.example.asynctask I/System.out: subcriber2:3
2019-12-22 14:42:10.095 6084-6128/com.example.asynctask I/System.out: subcriber2:4
從結果看出,subcriber1和subcriber2的結果並一定相同,二者是完全獨立的,但是對於某些事件不確定何時發生以及不確定Observable 發射的元素數量的情況,還是使用Hot Observable,比如UI交互的事件、網絡環境的變化、地理位置的變化、服務器推送的消息到達等。