我有一个Activity
我正在创建和订阅Single
类的多个实例(每个实例在一个单独的后台线程中完成一些工作)。对于每个订阅,我将创建的Disposable
实例添加到范围为CompositeDisposable
的{{1}}实例。当Activity
被销毁时,我正在调用Activity
方法来处理CompositeDisposable.clear()
中的所有订阅。这当然意味着所有Activity
个实例(包括已完成工作的订阅的实例)都会在Disposable
中出现,直到Activity
被销毁。
这是否可以,或者每当特定Activity
实例完成工作时(即Disposable.dispose()
收到Single
或{时),我应该为每个订阅调用SingleObserver
{1}}回调)?后一种方法的问题在于我必须跟踪哪个onSuccess
与哪个onError
相关联(这使得使用Disposable
失败了)。每次SingleObserver
实例完成工作时,是否有更好的方法来处理订阅?
答案 0 :(得分:17)
不,你不应该。当Observable
完成后,Observable
会自行处理。
这是Observable contract:
当Observable向其观察者发出OnError或OnComplete通知时,这将结束订阅。观察者不需要发出取消订阅通知来结束Observable以这种方式结束的订阅。
答案 1 :(得分:1)
Yosriz的答案是正确的答案,但如果您确实要从Disposable
实例中移除CompositeDrawable
个实例,Single
订阅完成工作(而不是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();
}
...您可以将SingleObserver
传递给Single
订阅,如下所示:
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
}
});