Rx Java: как отказаться от подписки на тему из наблюдаемого - PullRequest
1 голос
/ 14 июля 2020

Используя RxJava3, учитывая Observable и Subject, я могу подписать Subject на Observable:

observable.subscribe(subject); // returns void, not a subscription

Позже мою Subject больше не интересует Observable, как отказаться от подписки это из Observable?

1 Ответ

2 голосов
/ 14 июля 2020

Я думаю, что самый простой вариант - использовать перегрузку subscribe, которая возвращает Disposable, и каждый обработчик вызывает соответствующий метод на вашем Subject, вот так:

Disposable d = observable
    .subscribe(subject::onNext, subject::onError, subject::onComplete);

// Later
d.dispose();

Вы также можете создать DisposableObserver, который пересылает все сообщения на Subject, и использовать subscribeWith вместо subscribe, хотя он более подробный:

Disposable d = observable
.subscribeWith(new DisposableObserver<Integer>() {
         @Override public void onStart() {
         }
         @Override public void onNext(Integer t) {
             subject.onNext(t);
         }
         @Override public void onError(Throwable t) {
             subject.onError(t);
         }
         @Override public void onComplete() {
             subject.onComplete();
         }
     });

Я не знаю никаких более чистых вариантов, и эта проблема из трекера ошибок Rx Java, похоже, подтверждает это, хотя он нацелен на RxJava2.

...