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



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

这是否可以,或者我应该在每次特定Single实例完成工作时(即当SingleObserver收到onSuccessonError回调时(为每个单独的订阅调用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.它将在需要时自动处置。

最新更新