java.lang. OutOfMemoryError: растровый размер превышает бюджет VM - Android

Я разработал приложение, которое использует много изображений на Android.

Выполнение приложения однажды, заполняет информацию об экране (Layouts, Listviews, Textviews, ImageViews, и т.д.), и пользователь читает информацию.

Нет никакой анимации, никаких специальных эффектов или чего-либо, что может заполнить память. Иногда drawables может измениться. Некоторые - ресурсы андроида, и некоторые - файлы, сохраненные в папке в SDCARD.

Затем пользовательские выходы ( onDestroy метод выполняется, и приложение остается в памяти VM), и затем в какой-то момент пользователь входит снова.

Каждый раз, когда пользователь входит в приложение, я вижу, что память растет все больше, пока пользователь не добирается java.lang.OutOfMemoryError.

Таким образом, что лучший/корректный путь состоит в том, чтобы обработать много изображений?

Я должен поместить их в статические методы, таким образом, они не загружаются все время? Я должен убрать расположение или изображения, используемые в расположении специальным способом?

157
задан Ironman 3 July 2016 в 10:46
поделиться

2 ответа

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

Трудно сказать, почему это происходит, не глядя на ваш код. Однако в этой статье есть несколько советов, которые могут помочь:

http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html

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

70
ответ дан 23 November 2019 в 21:47
поделиться
-

Я столкнулся именно с этой проблемой. Куча довольно маленькая, поэтому эти образы могут довольно быстро выйти из-под контроля в отношении памяти. Один из способов - дать мусорщику подсказку собрать память на растровой карте, вызвав его метод рециркуляции . Также не гарантируется, что метод onDestroy будет вызван. Возможно, вы захотите перенести эту логику/цикл вверх в активность onPause. Для получения дополнительной информации ознакомьтесь с диаграммой/таблицей жизненного цикла активности на этой странице .

.
7
ответ дан 23 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: