为什么在这种情况下处置 DisposableObserver 很重要

Why is disposing DisposableObserver is important in this case

我正在从事 android 具有干净架构的项目。

我有以下 class:

public abstract class RxBaseInteractor<T, Params> {

  private final CompositeDisposable disposables;

  public RxBaseInteractor() {
    this.disposables = new CompositeDisposable();
  }

  abstract public Observable<T> buildUseCaseObservable(Params params);

  public void execute(DisposableObserver<T> observer, Params params) {
    Preconditions.checkNotNull(observer);
    final Observable<T> observable = this.buildUseCaseObservable(params)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());
    addDisposable(observable.subscribeWith(observer));
  }

  public void dispose() {
    if (!disposables.isDisposed()) {
      disposables.dispose();
    }
  }

  protected void addDisposable(Disposable disposable) {
    Preconditions.checkNotNull(disposable);
    Preconditions.checkNotNull(disposables);
    disposables.add(disposable);
  }
}

因此 execute(..) 获取一个 DisposableObserver,然后调用一个 dispose() 方法来处理这个可观察对象。

在我的例子中,observable 可能来自使用改造的 WebApi 或使用 Realm 的缓存。

现在在演示者 onDestroy() 中,我将 interactor.dispose() 称为:

 @Override public void destroy() {
        super.destroy();
        myInteractor.dispose();
    }

在视图之后调用:

    @Override public void onDestroy() {
    super.onDestroy();
    if (getPresenter() != null) {
      getPresenter().destroy();
    }
  }

我完全理解架构,也理解处理非托管网络或数据库资源,但我需要完全理解在这种情况下,observable 的处理是否真的很重要,因为我认为 Retrofit 或 Realm 自动管理关闭连接并在那里配置资源。

我认为这与处置领域或改造资源无关,但它可能与取消订阅可观察对象有关,因为我检查了文档并发现:

Class DisposableObserver: An abstract Observer that allows asynchronous cancellation by implementing Disposable. All pre-implemented final methods are thread-safe.

Use the public dispose() method to dispose the sequence from within an onNext implementation.

但我仍然不明白使用它的好处。是否在销毁视图时取消订阅可观察对象,以便它从 onNext() 变为 onComplete() 并关闭发射器上的订阅?

之所以使用 dispose 方法是因为在系统启动视图后(activityfragment),订阅开始,然后您决定返回或启动另一个视图旧的订阅仍在执行并且没有完成它的工作。这意味着它仍在内存中,这将导致 memory leak。所以取消订阅需要调用dispose方法

在@abozaid 的回答中添加更多内容,当旧订阅仍然是 On 并且与此同时,我们的用户切换到其他视图(activityfragment)或关闭旧视图(或 application 本身),它肯定会 leak 内存。

但是,如果我们使用 AndroidSchedulers.mainThread() 调度程序观察 UI 更新 的可观察对象,那么我们的代码将 崩溃 因为在更新 UI 时,viewcontext 会消失(或销毁)。

myObservable.observeOn(AndroidSchedulers.mainThread()) // like this

另外一点,我可以在这里补充的是,即使我们通过在代码中加入预防措施来处理 崩溃 subscription 运行 未使用会 hamper performance 在某个阶段。