delay操作符的作用是延时执行
Observable.just(1, 2, 3).delay(2, TimeUnit.SECONDS).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(@NotNull Disposable d) {
System.out.println("onSubscribe");
}
@Override
public void onNext(@NotNull Integer integer) {
System.out.println("onNext " + integer);
}
@Override
public void onError(@NotNull Throwable e) {
System.out.println("onError " + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("onSubscribe");
}
});
看看源码
public final Observable<T> delay(long delay, TimeUnit unit) {
return delay(delay, unit, Schedulers.computation(), false);
}
public final Observable<T> delay(long delay, TimeUnit unit, Scheduler scheduler, boolean delayError) {
...
return RxJavaPlugins.onAssembly(new ObservableDelay<T>(this, delay, unit, scheduler, delayError));
}
ObservableDelay 创建一个Scheduler.Worker实例,用来执行延时任务。
public final class ObservableDelay<T> extends AbstractObservableWithUpstream<T, T> {
final long delay;
final TimeUnit unit;
final Scheduler scheduler;
final boolean delayError;
public ObservableDelay(ObservableSource<T> source, long delay, TimeUnit unit, Scheduler scheduler, boolean delayError) {
super(source);
this.delay = delay;
this.unit = unit;
this.scheduler = scheduler;
this.delayError = delayError;
}
@Override
@SuppressWarnings("unchecked")
public void subscribeActual(Observer<? super T> t) {
Observer<T> observer;
if (delayError) {
observer = (Observer<T>)t;
} else {
observer = new SerializedObserver<T>(t);
}
Scheduler.Worker w = scheduler.createWorker();
source.subscribe(new DelayObserver<T>(observer, delay, unit, w, delayError));
}
...
}
每次上游发送数据,都会执行延时任务,delay表示从当前时间延时。
public void onNext(final T t) {
w.schedule(new OnNext(t), delay, unit);
}