是否建议在订阅完成后立即调用 Disposable.dispose()?

Is it recommended to call Disposable.dispose() as soon as a subscription completes work?

我有一个 Activity,我正在其中创建和订阅 Single class 的多个实例(每个实例都在单独的后台线程中执行一些工作)。对于每个订阅,我将创建的 Disposable 实例添加到范围为 ActivityCompositeDisposable 实例。当 Activity 被销毁时,我调用 CompositeDisposable.clear() 方法来处理 Activity 中的所有订阅。当然,这意味着所有 Disposable 实例(包括已完成工作的订阅实例)都在我的 Activity 中徘徊,直到 Activity 被销毁。

这样可以吗?还是我应该在每次特定 Single 实例完成工作时为每个单独的订阅调用 Disposable.dispose()(即,当 SingleObserver 收到 onSuccessonError回调)?后一种方法的问题是我必须跟踪哪些 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
          }
      });

没有。会在需要的时候自动销毁。