2015-08-13 4 views
2

Я использую метод Observable.zip RxJava для объединения двух вызовов API в один результат. По какой-то причине я получаю утечку памяти, несмотря на то, что я отписываюсь от подписки. Я не уверен, что это ошибка на моем конце, или если есть что-то, что мне нужно сделать с созданием Observable.RxJava Observable Zip вызывает утечку памяти

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 trace

Любая помощь будет оценена.

+0

Можете ли вы показать нам источники, api.getConfiguration(), api.getSettings()? –

+0

'api' - это просто интерфейс для доработки, так что на самом деле нет. – trev9065

+0

какая версия модификации? –

ответ

0

Я подозреваю, что утечка исходит от самого subscription, поскольку вы, похоже, продолжаете ссылаться на Subscriber через него. Попробуйте очистить эту ссылку в onDestroy и снова проверить утечки.

0

Это, вероятно, утечка в модификации, похоже, что было похоже here.

Обратите внимание, что если модернизация утечки абонента, вы можете ограничить воздействие, если функция mapper больше не ссылается на ваш экземпляр активности. В вашем случае Struct, вероятно, является нестатистическим классом экземпляра (следовательно, имеет неявную ссылку на экземпляр активности), если вам удастся сделать его статическим без ссылки на активность, вы, скорее всего, избавитесь от этой самой утечки.