2

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

泄漏痕迹

任何帮助,将不胜感激。

4

2 回答 2

0

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

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

于 2015-10-15T08:06:35.843 回答
0

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

于 2015-10-14T20:59:56.363 回答