RxJava:超时期间的两次调用

时间:2016-09-20 22:22:51

标签: java timeout rx-java

我的任务是在超时时发生两个或多个事件时调用订阅者。第一个事件触发超时,如果在超时期间没有任何反应 - 它将在下一个启动时再次启动,依此类推。 我正在使用以下构造:

    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;
      }
    )

也许有一种方法可以不用触发器?

1 个答案:

答案 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(...);