簡體   English   中英

Observable.Create和Observer處置

[英]Observable.Create and Observer Disposal

我想了解我何時使用

    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之后, OnComplete 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()之后發出項目。

Disposable僅持有對subscription的引用,為了對其進行處置,您需要調用disposable.dispose()Observable不會在complete方法上處置Disposable實例。

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

最初, isDisposed旨在指示調用了dispose 由於onErroronComplete默認情況下不調用dispose ,因此終止后通常不會使isDisposed true。 Reactive Streams規范指出,在調用onErroronComplete時,應將訂閱視為已取消,這意味着實現中不需要任何實際代碼(因此開銷)。

不幸的是,人們開始在流程外部將其用作完成指標(即,查看特定的subscribe()是否已達到其最終狀態)。 我不建議依賴isDisposed (在Disposable容器之外),因為它通過可能等待同步的同步(和阻塞)使異步完成反應isDisposed

在您的特定情況下, disposable將在onComplete返回后指示isDisposed ,因此外部視圖將指示isDisposed true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM