Observable是否会缓存发出的项目?我有两个测试可以得出不同的结论:
从测试#1我得出结论:
测试#1:
Observable<Long> clock = Observable
.interval(1000, TimeUnit.MILLISECONDS)
.take(10)
.map(i -> i++);
//subscribefor the first time
clock.subscribe(i -> System.out.println("a: " + i));
//subscribe with 2.5 seconds delay
Executors.newScheduledThreadPool(1).schedule(
() -> clock.subscribe(i -> System.out.println(" b: " + i)),
2500,
TimeUnit.MILLISECONDS
);
输出#1:
a: 0
a: 1
a: 2
b: 0
a: 3
b: 1
但是第二次测试显示我们为两个观察者获得了不同的值:
测试#2:
Observable<Integer> observable = Observable
.range(1, 1000000)
.sample(7, TimeUnit.MILLISECONDS);
observable.subscribe(i -> System.out.println("Subscriber #1:" + i));
observable.subscribe(i -> System.out.println("Subscriber #2:" + i));
输出#2:
Subscriber #1:72745
Subscriber #1:196390
Subscriber #1:678171
Subscriber #2:336533
Subscriber #2:735521
答案 0 :(得分:1)
存在两种Observable:热和冷。寒冷的观察者倾向于为其观察者生成相同的序列,除非你有外部效应,例如与之相关的基于计时器的动作。
在第一个例子中,你得到两次相同的序列,因为除了你一个接一个的计时器滴答之外没有外部效果。在第二个示例中,您对快速源进行采样,并且随时间采样具有非确定性效果:每纳秒计数,因此即使最轻微的不精确也会导致报告的值不同。