rx java -永远定期运行的间隔

  • 本文关键字:运行 java 永远 rx rx-java
  • 更新时间 :
  • 英文 :


好的,通常可以使用Observable.interval(1, TimeUnit.SECONDS)创建一个可观察对象,它将每秒发出一个值。

但是interval发出一个整数值。如果我们让它运行到ÌNT_MAX '会发生什么?一个溢出?

是否有一个操作符可以做同样的事情,即周期性地发出一个不带计数器的值?

基本上我只是想要一个可观察对象来调度周期性的作业…

实际上interval发出一个Long值,内部使用一个long计数器。在实践中,您永远不会达到Long.MAX_VALUE(每纳秒释放一个值,需要292年才能溢出)。

interval返回Observable<Long>。所以counter的值是long。

如果我们让这个运行到LONG_MAX,溢出将发生。但是interval不会停止。interval将继续发出如下值:

  • 9223372036854775807
  • -9223372036854775808
  • -9223372036854775807

如果你想要interval没有计数器,创建OnSubscribe如下:

public class OnSubscribeNoCounterTimerPeriodically  implements Observable.OnSubscribe<Void> {
    final long initialDelay;
    final long period;
    final TimeUnit unit;
    final Scheduler scheduler;
    public OnSubscribeNoCounterTimerPeriodically(long period, TimeUnit unit) {
        this(period, period, unit, Schedulers.computation());
    }
    public OnSubscribeNoCounterTimerPeriodically(long initialDelay, long period, TimeUnit unit, Scheduler scheduler) {
        this.initialDelay = initialDelay;
        this.period = period;
        this.unit = unit;
        this.scheduler = scheduler;
    }
    @Override
    public void call(final Subscriber<? super Void> child) {
        final Scheduler.Worker worker = scheduler.createWorker();
        child.add(worker);
        worker.schedulePeriodically(new Action0() {
            @Override
            public void call() {
                try {
                    child.onNext(null);
                } catch (Throwable e) {
                    try {
                        worker.unsubscribe();
                    } finally {
                        Exceptions.throwOrReport(e, child);
                    }
                }
            }
        }, initialDelay, period, unit);
    }
}

像这样使用:

Observable.create(new OnSubscribeNoCounterTimerPeriodically(1, TimeUnit.SECONDS))

最新更新