Rxjava2 defer

72 阅读1分钟

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);
    }
}