Intereting Posts

Утечка памяти FragmentStatePagerAdapter (вложенные фрагменты с помощью viewpager)

У меня есть «утечка памяти» в моем адаптере (кавычки будут объяснены позже). В настоящее время я использую вложенные фрагменты для размещения viewpager.

Моя настройка такова:
1. Действие (Пустое действие, в котором находится фрагмент A)
2. Фрагмент A – фрагмент, в котором размещается viewpager с Fragmentstatepageradapter. На каждой странице viewpager размещен фрагмент B.
3. Фрагмент B – фрагмент, содержащий изображение.

Все работает отлично, за исключением случаев, когда происходит изменение конфигурации. Наблюдая за кучей, он, кажется, растет на 100 кб каждый раз, когда происходит поворот. В ручном режиме GCing не освобождает память.

Вещи, которые я пробовал:
1. Замените фрагмент B пустым фрагментом – такая же проблема возникает, поэтому проблема с изображением не вызывает проблемы.
2. Удалите оба фрагмента A и B и поверните действие. Нет утечки памяти, поэтому это не активность.
3. Используется MAT до изменения любой ориентации и после поворота примерно 50 раз, чтобы получить кучу. MAT показывает 1 главный подозреваемый, который является моим классом адаптера. Он показывает 7 Мбайт сохраненной кучи (очень маленькой мелкой кучи) наблюдателей:

array java.util.ArrayList @ 0x42079938 24 7,000,832 .\mObservers android.database.DataSetObservable @ 0x42053508 16 7,000,848 ..\mObservable com.example.main.Adapter@ 0x4205a048 40 7,001,416 

Почему я использую viewpager внутри фрагмента:
1. Я хочу сохранить состояние адаптера и других переменных, связанных с зрителем, живым, установив setretaininstance (true).
2. После изменения конфигурации я не воссоздаю адаптер, но использую старый, чтобы подключиться к viewpager.
3. Если я не повторно использую старый адаптер, но создаю новый адаптер после изменения конфигурации, утечка памяти исчезнет.
4. утечка памяти также исчезает после закрытия операции и возврата к предыдущему действию.

Есть идеи? Поблагодарили бы за любую помощь.

Спасибо, JC

У меня была аналогичная утечка памяти, которая теперь разрешена.

В моем соответствующем фрагменте A я this.getFragmentManager() экземпляр FragmentStatePagerAdapter с this.getFragmentManager() вместо this.getChildFragmentManager() так как вложенные фрагменты на месте.

Пожалуйста, дайте мне знать, если это также устранит вашу проблему.