我的任务是在超时时发生两个或多个事件时调用订阅者。第一个事件触发超时,如果在超时期间没有任何反应 - 它将在下一个启动时再次启动,依此类推。 我正在使用以下构造:
boolean trigger = false;
Observable.interval(...)
.filter(...)
.timeout(10, TU.SECONDS, Observable.just(false))
.subscribe(par ->
if (par){
if (trigger){
twoTimesInTimeout();
} else {
trigger = true;
}
} else {
trigger = false;
}
)
也许有一种方法可以不用触发器?
答案 0 :(得分:0)
如果在给定的毫秒数内有另一次发射,该方法将重新发射每个发射。我比较每次连续发射的时间,如果满足时限,则重新发射。
<T> Observable<T> emitIfWithin(Observable<T> obs, long millis){
zip(obs.timestamp(), obs.skip(1).timestamp(), Pair::new)
.filter(pair -> pair.first.getTimestampMillis() - pair.first.getTimestampMillis() < millis)
.map(pair -> pair.first);
}
然后使用您想要的过滤器调用它以最大限度地重复使用:
emitIfWithin(observable.ofType(A.class), 10000)
.subscribe(...);