Observable.Create和Observer Disposal

时间:2018-01-26 06:07:18

标签: java android rx-java2

我试图了解何时使用

    Observable.just(1).subscribe(new Observer<Integer>() {

        Disposable disposable;

        @Override
        public void onSubscribe(Disposable disposable) {
            System.out.println("Subscribed");
            this.disposable = disposable;
        }

        @Override
        public void onNext(Integer integer) {
            System.out.println(integer);
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onError(Throwable throwable) {
            System.out.println("Error");
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onComplete() {
            System.out.println("Complete");
            System.out.println(disposable.isDisposed());
        }
    })

OnCompleteOnError之后,disposable.isDisposed()返回true,就像我使用时一样

  Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> observableEmitter) throws Exception {
            if (!observableEmitter.isDisposed())
                observableEmitter.onComplete();
        }
    }).subscribe(new Observer<Integer>() {

        Disposable disposable;

        @Override
        public void onSubscribe(Disposable disposable) {
            System.out.println("Subscribed");
            this.disposable = disposable;
        }

        @Override
        public void onNext(Integer integer) {
            System.out.println(integer);
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onError(Throwable throwable) {
            System.out.println("Error");
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onComplete() {
            System.out.println("Complete");
            System.out.println(disposable.isDisposed());
        }
    }); 

我看到disposable.isDisposed()返回false。有人可以解释一下我到底发生了什么吗?我理解写得好的Observable.create不能在onComplete()onError()之后发出项目。

2 个答案:

答案 0 :(得分:0)

Disposable只保留对subscription的引用,为了处置它,您需要调用disposable.dispose()Observable不要在完整方法上配置Disposable实例

 @Override
        public void onComplete() {
            System.out.println("Complete");
            disposable.dispose();
            System.out.println(disposable.isDisposed());
        }

答案 1 :(得分:0)

最初,isDisposed意味着表示dispose被调用。由于onErroronComplete默认情况下不会调用dispose,因此终止后通常不会isDisposed为真。 Reactive Streams规范指出,在调用onErroronComplete时,应认为订阅已取消,这意味着实现中不需要实际代码(因此开销)。

不幸的是,人们开始将其用作流程外的完成指示符(即,查看特定subscribe()是否已达到其终端状态)。我不建议依赖isDisposedDisposable个容器外),因为它会将异步响应与完成同步,并可能同步(并阻塞)等待完成。

在您的特定情况下,disposable会在isDisposed返回后显示onComplete,因此外部视图会显示isDisposed为真。