У меня есть "утечка памяти" в моем адаптере (кавычки будут объяснены позже). В настоящее время я использую вложенные фрагменты для размещения пейджера.
Моя установка выглядит следующим образом:
1. Активность (пустая активность, в которой размещается фрагмент A)
2. Фрагмент A — фрагмент, в котором размещается viewpager с Fragmentstatepageradapter. Каждая страница просмотра содержит фрагмент 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. Я хочу сохранить состояние адаптера и других переменных, связанных с viewpager, установив setretaininstance(true).
2. После изменения конфигурации Я не создаю адаптер заново, а использую старый для подключения к странице просмотра.
3. Если я не использую старый адаптер повторно, а создаю новый адаптер после изменения конфигурации, утечка памяти исчезает.
4. утечка памяти также исчезает после того, как я закрою действие и вернусь к предыдущему действию.
Есть идеи? Был бы признателен за любую помощь.
Спасибо, Джей Си