是否建议在订阅完成后立即调用 Disposable.dispose()?
Is it recommended to call Disposable.dispose() as soon as a subscription completes work?
我有一个 Activity
,我正在其中创建和订阅 Single
class 的多个实例(每个实例都在单独的后台线程中执行一些工作)。对于每个订阅,我将创建的 Disposable
实例添加到范围为 Activity
的 CompositeDisposable
实例。当 Activity
被销毁时,我调用 CompositeDisposable.clear()
方法来处理 Activity
中的所有订阅。当然,这意味着所有 Disposable
实例(包括已完成工作的订阅实例)都在我的 Activity
中徘徊,直到 Activity
被销毁。
这样可以吗?还是我应该在每次特定 Single
实例完成工作时为每个单独的订阅调用 Disposable.dispose()
(即,当 SingleObserver
收到 onSuccess
或onError
回调)?后一种方法的问题是我必须跟踪哪些 Disposable
链接到哪些 SingleObserver
,这违背了使用 CompositeDisposable
.
的意义
不,你不应该。当一个 Observable
完成时,Observable
会自行处理掉。这是 Observable contract:
的一部分
When an Observable issues an OnError or OnComplete notification to its observers, this ends the subscription. Observers do not need to issue an Unsubscribe notification to end the subscriptions that are ended by the Observable in this way.
是正确答案,但如果您确实想在 Single
订阅完成后立即从 CompositeDisposable
实例中删除 Disposable
实例(而不是让 Disposable
实例挂起),然后我整理了以下摘要 class:
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();
}
您可以将此 class 的具体扩展作为 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
}
});
没有。会在需要的时候自动销毁。
我有一个 Activity
,我正在其中创建和订阅 Single
class 的多个实例(每个实例都在单独的后台线程中执行一些工作)。对于每个订阅,我将创建的 Disposable
实例添加到范围为 Activity
的 CompositeDisposable
实例。当 Activity
被销毁时,我调用 CompositeDisposable.clear()
方法来处理 Activity
中的所有订阅。当然,这意味着所有 Disposable
实例(包括已完成工作的订阅实例)都在我的 Activity
中徘徊,直到 Activity
被销毁。
这样可以吗?还是我应该在每次特定 Single
实例完成工作时为每个单独的订阅调用 Disposable.dispose()
(即,当 SingleObserver
收到 onSuccess
或onError
回调)?后一种方法的问题是我必须跟踪哪些 Disposable
链接到哪些 SingleObserver
,这违背了使用 CompositeDisposable
.
不,你不应该。当一个 Observable
完成时,Observable
会自行处理掉。这是 Observable contract:
When an Observable issues an OnError or OnComplete notification to its observers, this ends the subscription. Observers do not need to issue an Unsubscribe notification to end the subscriptions that are ended by the Observable in this way.
Single
订阅完成后立即从 CompositeDisposable
实例中删除 Disposable
实例(而不是让 Disposable
实例挂起),然后我整理了以下摘要 class:
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();
}
您可以将此 class 的具体扩展作为 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
}
});
没有。会在需要的时候自动销毁。