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

时间:2017-06-18 12:24:46

标签: android rx-java2

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

这是否可以,或者每当特定Activity实例完成工作时(即Disposable.dispose()收到Single或{时),我应该为每个订阅调用SingleObserver {1}}回调)?后一种方法的问题在于我必须跟踪哪个onSuccess与哪个onError相关联(这使得使用Disposable失败了)。每次SingleObserver实例完成工作时,是否有更好的方法来处理订阅?

2 个答案:

答案 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
          }
      });