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交互的事件、网络环境的变化、地理位置的变化、服务器推送的消息到达等。

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