2017-01-02 3 views
5

In RxJava 1 Subskription mit einem Observer gab ein Abonnement zurück, das abgemeldet werden konnte.Disposable für Beobachter

In RxJava 2 Subskription mit einem Observer gibt void und keine Disposeable zurück. Wie ist es möglich, dieses "Abonnement" zu stoppen?

// v1 
rx.Observable<Long> v1hot = rx.Observable.interval(1, TimeUnit.SECONDS); 
rx.Observer<Long> v1observer = new TestSubscriber<>(); 
Subscription subscription = v1hot.subscribe(v1observer); 
subscription.unsubscribe(); 

// v2 
Observable<Long> v2hot = Observable.interval(1, TimeUnit.SECONDS); 
Observer<Long> v2Observer = new TestObserver<>(); 
v2hot.subscribe(v2Observer); // void 

EDIT: wie den Fall behandeln, in denen wir einen Beobachter zu benutzen, die sich Disposable nicht implementiert, wie BehaviorSubject? Wie in diesem Beispiel:

// v1 
rx.Observable<Long> v1hot = rx.Observable.interval(1, TimeUnit.SECONDS); 
rx.Observer<Long> v1observer = rx.subjects.BehaviorSubject.create(); 
Subscription subscription = v1hot.subscribe(v1observer); 
subscription.unsubscribe(); 

// v2 
Observable<Long> v2hot = Observable.interval(1, TimeUnit.SECONDS); 
Observer<Long> v2Observer = BehaviorSubject.createDefault(-1L); 
v2hot.subscribe(v2Observer); // void 

Antwort

8

Allothersubscribemethodsreturn ein Disposable. In Ihrem Beispiel implementiert die TestObserver selbst , so dass Sie dispose() auf den Beobachter selbst anrufen können, um das Abonnement zu entsorgen.

Andernfalls können Sie DisposableObserver als Basisklasse für Ihre eigenen benutzerdefinierten Beobachter das Verhalten Disposable von der abstrakten Basisklasse zur Verfügung gestellt haben.

EDIT die aktualisierte Frage zu beantworten:

Im Fall, dass Sie (void zurückgibt die einzigste) die subscribe(Observer) Methode verwenden, aber Sie müssen eine Observer verwenden, die nicht Disposable nicht implementiert, noch haben Sie die Option, Ihre Observer in eine SafeObserver zu wickeln, die Ihnen Verhalten (unter anderem Vertragskonformitätsgarantien) bieten wird.

+0

In diesem speziellen Fall funktioniert das. Was aber, wenn das nicht umgesetzt wird? Wie wenn es ein Thema (aktualisierte Frage) ist. –

+0

Ich habe meine Antwort aktualisiert. –

+0

Danke! Ich frage mich, warum sie das geändert haben. Das ist sehr unpraktisch. –