在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
答案 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)
返回一次性物品。