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