RxJava Observable Zip导致内存泄漏

时间:2015-08-13 15:22:25

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

我正在使用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的踪迹。

leak trace

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

我怀疑泄漏来自subscription本身,因为您似乎不断通过它引用Subscriber。尝试在onDestroy中清除该引用并再次检查泄漏。

答案 1 :(得分:0)

这可能是改造中的泄漏,似乎有类似的报道here

请注意,如果改装泄漏订户,您可以限制影响,如果您的映射器功能不再引用您的活动实例。 在你的情况下Struct可能是一个非静态实例类(因此有一个对活动实例的隐式引用),如果你设法使它静态而不引用活动,你可能会摆脱它这个非常泄密。