Disposeable for Observer

时间:2017-01-02 15:05:41

标签: rx-java rx-java2

在RxJava 1中订阅Observer返回了一个可以取消订阅的订阅。

在RxJava 2中订阅Observer返回void而没有Disposeable。如何停止“订阅”?

// 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

编辑:如何处理这种情况,我们使用的观察者本身并不实现Disposable,例如BehaviorSubject?就像在这个例子中一样:

// 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

2 个答案:

答案 0 :(得分:8)

All other subscribe methods return一个Disposable。在您的示例中,TestObserver本身实现了final Calendar c = Calendar.getInstance(); year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DAY_OF_MONTH); dateInMillis = c.getTimeInMillis(); // Added this to make it work c.set(year, month, day, 4, 0, 0); c.set(Calendar.MILLISECOND, 0); // End addition db = new DatabaseHandler(CounterActivity.this); db.addDailyPreachLog(dateInMillis, tod_spin.getSelectedItem().toString(), counters); db.close(); ,因此您可以在观察者本身上调用dispose()来处置订阅。

否则,您可以使用DisposableObserver作为自定义观察者的基类,以便抽象基类为您提供Disposable行为。

编辑以回答更新的问题:

如果您需要使用subscribe(Observer)方法(返回空白的方法),但您需要使用不Disposable的{​​{1}},您仍然需要将Observer包裹在SafeObserver中的选项将为您提供Disposable行为(以及其他合同一致性保证)。

答案 1 :(得分:0)

您可以致电subscribe(Observer)而不是致电subscribeWith(DisposableObserver) 返回一次性物品。