6

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

我有以下课程:

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。

在我的情况下,observable 可能来自 WebApi 使用改造或缓存使用领域。

现在在演示者 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 自动管理关闭连接并处置那里的资源。

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

DisposableObserver 类:一个抽象的 Observer,通过实现 Disposable 允许异步取消。所有预先实现的 final 方法都是线程安全的。

使用公共 dispose() 方法从 onNext 实现中释放序列。

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

4

2 回答 2

15

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

于 2017-11-04T13:39:42.940 回答
2

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

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

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

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

于 2020-01-02T05:35:48.790 回答