好的,通常可以使用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))