如何在onComplete之后显式取消订阅observable

问题描述 投票:3回答:3

在下面的代码中,在完成unSubscribe后,如何以及在何处放置Observable以明确地取消订阅onComplete

getObservable()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe(new Subscriber<Boolean>() {
        @Override
        public void onCompleted() {
            doSomething();
        }

        @Override
        public void onError(Throwable e) {
            thereIsError();
        }

        @Override
        public void onNext(Boolean status) {
            updateView();
        }
    });
rx-java rx-java2 rx-android
3个回答
3
投票

你可以保存Disposable方法返回的subscribe并在onCompleted回调中使用它

Disposable d = 
getObservable()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe(new Subscriber<Boolean>() {
        @Override
        public void onCompleted() {
            doSomething();
            d.dispose();
        }

        @Override
        public void onError(Throwable e) {
            thereIsError();
        }

        @Override
        public void onNext(Boolean status) {
            updateView();
        }
    });

3
投票
 disposables.add(sampleObservable()
            // Run on a background thread
            .subscribeOn(Schedulers.io())
            // Be notified on the main thread
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableObserver<String>() {
                @Override
                public void onComplete() {
                    // Do some work for completion
                }

                @Override
                public void onError(Throwable e) {
                     // Do some work for error
                }

                @Override
                public void onNext(String value) {
                    // Do some work for next
                }
            }));

并清楚和取消订阅

@Override
protected void onDestroy() {
    super.onDestroy();
    disposables.clear(); // do not send event after activity has been destroyed
    disposables.dispose();
}

2
投票

简短的回答是,你没有理由明确取消订阅,因为观察者链是这样做的。您可以通过添加此运算符来自行测试:

.doOnUnsubscribe( () -> System.out.println("Unsubscribed") )
© www.soinside.com 2019 - 2024. All rights reserved.