Hot Observable 和 Cold Observable的區別

 

 

  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交互的事件、網絡環境的變化、地理位置的變化、服務器推送的消息到達等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章