我有一个Activity
,我在其中创建和订阅Single
类的多个实例(每个实例都在单独的后台线程中做一些工作(。对于每个订阅,我将创建的Disposable
实例添加到作用域为Activity
的CompositeDisposable
实例。销毁Activity
时,我调用CompositeDisposable.clear()
方法来处置Activity
中的所有订阅。当然,这意味着所有Disposable
实例(包括已完成工作的订阅实例(都在我的Activity
中徘徊,直到Activity
被销毁。
这是否可以,或者我应该在每次特定Single
实例完成工作时(即当SingleObserver
收到onSuccess
或onError
回调时(为每个单独的订阅调用Disposable.dispose()
?后一种方法的问题在于我必须跟踪哪些Disposable
链接到哪个SingleObserver
,这违背了使用CompositeDisposable
的意义。
不,你不应该。当Observable
完成时,Observable
会自行处置。这是可观察合约的一部分:
当可观察对象向其观察者发出 OnError 或 OnComplete 通知时,这将结束订阅。观察者无需发出取消订阅通知即可结束以这种方式结束的可观察对象结束的订阅。
Yosriz 的答案是正确的答案,但如果您确实希望在Single
订阅完成工作后立即从CompositeDisposable
实例中删除Disposable
实例(并且不让Disposable
实例闲逛(,那么我整理了以下抽象类:
public abstract class MySingleObserver<T> implements SingleObserver<T> {
private Disposable disposable;
@Override
public void onSubscribe(@NonNull Disposable disposable) {
this.disposable = disposable;
onStart();
}
public Disposable getDisposable() {
return disposable;
}
public abstract void onStart();
}
可以将此类的具体扩展作为Single
订阅的SingleObserver
传递,如下所示:
Single.just(1)
.subscribe(new MySingleObserver<Integer>() {
@Override
public void onStart() {
MyActivity.this.myCompositeDisposable.add(getDisposable());
// do something further
}
@Override
public void onSuccess(@NonNull Integer success) {
MyActivity.this.myCompositeDisposable.remove(getDisposable());
// do something further
}
@Override
public void onError(@NonNull Throwable error) {
MyActivity.this.myCompositeDisposable.remove(getDisposable());
// do something further
}
});
No.它将在需要时自动处置。