Intereting Posts
AsyncTask – как дождаться завершения onPostExecute () перед использованием значений, которые он обновил Поведение прокрутки AppBarLayout Обновления обновления недоступны для выбранного клиента Переход с Sharedelement между текстом и заголовком панели инструментов Автоматизировать импорт проектов Java (Android) в рабочее пространство Eclipse через командную строку Потоковая передача видео с использованием NanoHttpd, Ошибка: java.net.SocketException: sendto failed: EPIPE (Broken pipe) Изображение из камеры или галереи? КОРРУПЦИЯ ПАМЯТИ HEAP В ошибках dlmalloc или dlfree и SIGSEGV в Android ICS 4.0 Использование GCM на Android и iOS без полезной информации уведомления Минимум sdk для recycleview и плюсы / минусы замены списков с ним Android SDK менеджер не показывает пакеты, которые будут установлены Какие шаблоны дизайна используются на Android? SetTargetFragment для android.support.v4.app.Fragment? Jobb crash FAT Full Невозможно обнаружить совместимость устройства. Выберите целевое устройство

Утечка памяти 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() так как вложенные фрагменты на месте.

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