ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 为什么在这种情况下处理DisposableObserver很重要

2019-07-17 08:28:07  阅读:1754  来源: 互联网

标签:android dispose rx-java observable clean-architecture


我正在使用干净的架构开发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);
  }
}

所以执行(..)获取DisposableObserver然后有一个dispose()方法被调用来处理这个observable.

在我的例子中,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();
    }
  }

我完全理解架构,并且我理解处理未管理的网络或数据库资源,但我需要完全理解在这种情况下是否真的重要,因为我认为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.

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

解决方法:

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

标签:android,dispose,rx-java,observable,clean-architecture
来源: https://codeday.me/bug/20190717/1486605.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有