【问题标题】:RxJava Observable Zip Causes Memory LeakRxJava Observable Zip 导致内存泄漏
【发布时间】:2015-11-06 16:00:48
【问题描述】:

我正在使用 RxJava 的 Observable.zip 方法将两个 API 调用组合成一个结果。出于某种原因,尽管我取消了订阅,但我还是遇到了内存泄漏。我不确定这是否是我的错误,或者我是否需要创建 Observable。

protected void onCreate(Bundle bundle) {
...

subscription = Observable.zip(
      api.getConfiguration(),
      api.getSettings().map(r -> r.getData()),
      new Func2<ConfigurationResponse, List<Datum>, Struct>() {
        @Override
        public Struct call(ConfigurationResponse config, List<Datum> data) {
          return new Struct(data, config.getCopy(), config.getSettings());
        }
      }
    )
      .compose(Schedulers.applyApiSchedulers())
      .subscribe(
        struct -> {
          configurationManager.set(struct.data, struct.copy, struct.settings);
          startNextActivity();
        },
        error -> {
          startNextActivity();
        }
      );
}

protected void onDestroy() {
  if (!subscription.isUnsubscribed()) {
    subscription.unsubscribe();
  }
}

这是来自 Leak Canary 的踪迹。

任何帮助将不胜感激。

【问题讨论】:

  • 你能告诉我们来源,api.getConfiguration(),api.getSettings()吗?
  • api 只是一个 Retrofit 接口所以没有。
  • 什么版本的改造?
  • 我正在使用 Retrofit - 1.9.0、RxJava 1.0.14 和 RxAndroid 1.0.0。

标签: memory-leaks retrofit rx-java rx-android leakcanary


【解决方案1】:

我怀疑泄漏来自subscription 本身,因为您似乎一直通过它引用Subscriber。尝试清除 onDestroy 中的引用并再次检查是否有泄漏。

【讨论】:

    【解决方案2】:

    这可能是改造中的泄漏,here 似乎已经报告了类似的泄漏。

    请注意,如果改造泄露了订阅者,如果您的映射器函数不再引用您的活动实例,您可能能够限制影响。 在您的情况下Struct 可能是一个非静态实例类(因此具有对活动实例的隐式引用),如果您设法使其成为静态而不引用活动,您可能会摆脱这个非常泄漏.

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 2015-07-06
      • 2014-06-07
      • 2013-11-20
      • 2011-10-28
      • 2016-01-18
      • 2012-12-13
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多