我有一个基于时间的算法,在某些情况下,来自不同观测值的两个发射可能在同一时刻发生。
请参见下面的代码:
int moment = ...; //calculated
Observable.timer(moment, unit)
.takeUntil(messages)
.map(e -> new Action())
messages
的观察值在Schedulers.computation()
上执行,就像计时器一样。
当消息与计时器同时出现时,该行为是随机的。有时会发出新的Action
,有时则不会,takeUntil(messages)
优先。
我需要对此行为进行完全控制。当然,我可以向moment
添加几毫秒,就像这样,它将总是在messages
之后执行,但这不是我想要的。
如何告诉RxJava messages
比计时器优先?
更新:
为澄清这个问题,我添加了此测试,该测试每次执行都会成功
//before launching the test
RxJavaPlugins.setComputationSchedulerHandler(scheduler ->
new TestScheduler());
@Test
public void rx_precedence() {
int moment = 5;
Observable<Long> messages = Observable.timer(moment, TimeUnit.SECONDS);
TestObserver<Long> testObserver = Observable.timer(moment, TimeUnit.SECONDS)
.takeUntil(messages)
.test();
scheduler.advanceTimeTo(moment, TimeUnit.SECONDS);
testObserver.assertNoValues();
testObserver.assertTerminated();
}
在相同的moment
上,执行takeUntil
并且不发出任何值。
但是在服务器上,在现实世界中,当je JVM同时执行多项操作时,timer
可能优先于takeUntil
。
我需要一种使该优先级在任何环境下都稳定的方法,以便在messages
同时用完timer
发出值时不会发出任何值。
答案 0 :(得分:0)
您猜到Observable.amb()
,
http://reactivex.io/documentation/operators/amb.html
更新:
好的,问题现在更加清楚了。也许Scheduler.single()
会有所帮助。