У меня есть «утечка памяти» в моем адаптере (кавычки будут объяснены позже). В настоящее время я использую вложенные фрагменты для размещения 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()
так как вложенные фрагменты на месте.
Пожалуйста, дайте мне знать, если это также устранит вашу проблему.