私はActivity
を作成し、Single
クラスの複数のインスタンスをサブスクライブしています(それぞれが個別のバックグラウンドスレッドでいくつかの作業を行っています)。サブスクリプションごとに、作成されたDisposable
インスタンスを、CompositeDisposable
をスコープとするActivity
インスタンスに追加します。 Activity
が破棄されると、CompositeDisposable.clear()
メソッドを呼び出して、Activity
内のすべてのサブスクリプションを破棄します。もちろん、これは、すべてのDisposable
インスタンス(作業が完了したサブスクリプションのインスタンスを含む)がActivity
が破壊されるまで私のActivity
に滞留することを意味します。
これは大丈夫ですか、それとも、特定のSingle
インスタンスが作業を完了するたびに(つまり、SingleObserver
がonSuccess
を受け取ったときに、個々のサブスクリプションごとにDisposable.dispose()
を呼び出しますか?またはonError
コールバック)?後者のアプローチの問題は、どのDisposable
がどのSingleObserver
に関連付けられているかを追跡する必要があることです(これはCompositeDisposable
を使用するポイントを無効にします)。 Single
インスタンスが作業を完了するたびにサブスクリプションを破棄するためのより良いアプローチはありますか?
いいえ、できません。Observable
が完了すると、Observable
はそれ自体で破棄されます。
これは 監視可能な契約の一部です :
ObservableがOnErrorまたはOnComplete通知をオブザーバーに発行すると、サブスクリプションが終了します。オブザーバーは、この方法でObservableによって終了されたサブスクリプションを終了するために、購読解除通知を発行する必要はありません。
Yosrizの答えは正しい答えですが、Disposable
サブスクリプションが機能するため、CompositeDisposable
インスタンスから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
}
});