defer 操作符是延时创造观察者,它和我们平时使用的有什么不同?
class Worker {
String job = "default";
public Observable getObservableJust() {
return Observable.just(job);
}
public Observable getObservableDefer() {
return Observable.defer(new Callable<ObservableSource<?>>() {
@Override
public ObservableSource<?> call() throws Exception {
return Observable.just(job);
}
});
}
}
Worker worker = new Worker();
Observable observableJust = worker.getObservableJust();
Observable observableDefer = worker.getObservableDefer();
worker.job = "IT";
observableJust.subscribe(new Consumer() {
@Override
public void accept(Object o) throws Exception {
System.out.println("observableJust " + o);
}
});
observableDefer.subscribe(new Consumer() {
@Override
public void accept(Object o) throws Exception {
System.out.println("observableDefer " + o);
}
});
输出
observableJust default
observableDefer IT
public final class ObservableDefer<T> extends Observable<T> {
final Callable<? extends ObservableSource<? extends T>> supplier;
public ObservableDefer(Callable<? extends ObservableSource<? extends T>> supplier) {
this.supplier = supplier;
}
@Override
public void subscribeActual(Observer<? super T> observer) {
ObservableSource<? extends T> pub;
try {
// 一直到订阅才会执行
pub = ObjectHelper.requireNonNull(supplier.call(), "null ObservableSource supplied");
} catch (Throwable t) {
Exceptions.throwIfFatal(t);
EmptyDisposable.error(t, observer);
return;
}
pub.subscribe(observer);
}
}