Rxjava2 interval

158 阅读1分钟

interval的作用是间隔一段时间重复执行。

initialDelay表示延时多长时间后执行

period表示执行周期

scheduler表示调度器,以后再说。

直接看源码

  //使用这样的方式创建会延时执行
  public static Observable<Long> interval(long period, TimeUnit unit) {
        return interval(period, period, unit, Schedulers.computation());
    }
    
  public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler) {
       ...
        return RxJavaPlugins.onAssembly(new ObservableInterval(Math.max(0L, initialDelay), 
        		Math.max(0L, period), unit, scheduler));
    }  

ObservableInterval类的代码并不复杂,就是让调度器周期性的执行,每次执行都会执行Runnable接口的run方法,IntervalObserver是实现了Runnable接口 所以每次都是downstream.onNext(count++);

public final class ObservableInterval extends Observable<Long> {
    final Scheduler scheduler;
    final long initialDelay;
    final long period;
    final TimeUnit unit;

    public ObservableInterval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler) {
        this.initialDelay = initialDelay;
        this.period = period;
        this.unit = unit;
        this.scheduler = scheduler;
    }

    @Override
    public void subscribeActual(Observer<? super Long> observer) {
        IntervalObserver is = new IntervalObserver(observer);
        observer.onSubscribe(is);

        Scheduler sch = scheduler;

        if (sch instanceof TrampolineScheduler) {
            Worker worker = sch.createWorker();
            is.setResource(worker);
            worker.schedulePeriodically(is, initialDelay, period, unit);
        } else {
            Disposable d = sch.schedulePeriodicallyDirect(is, initialDelay, period, unit);
            is.setResource(d);
        }
    }

    static final class IntervalObserver
    extends AtomicReference<Disposable>
    implements Disposable, Runnable {

        private static final long serialVersionUID = 346773832286157679L;

        final Observer<? super Long> downstream;

        long count;

        IntervalObserver(Observer<? super Long> downstream) {
            this.downstream = downstream;
        }

        @Override
        public void dispose() {
            DisposableHelper.dispose(this);
        }

        @Override
        public boolean isDisposed() {
            return get() == DisposableHelper.DISPOSED;
        }

        @Override
        public void run() {
            if (get() != DisposableHelper.DISPOSED) {
                downstream.onNext(count++);
            }
        }

        public void setResource(Disposable d) {
            DisposableHelper.setOnce(this, d);
        }
    }
}