2016-05-14 3 views
2

Я только недавно начал разрабатывать приложения для Android и проблемы с памятью. Используя функцию отслеживания распределения в студии Android, я понял, что четыре кнопки ImageButtons, которые отображаются в нескольких действиях, скорее всего, вызовут проблему. Результат отслеживания распределения показывает, что почти вся память используется двумя способами в отношении изображений. См: Allocation Tracking resultИдентичные ImageButtons потребляют огромный объем памяти

В для вводимого коэффициента кнопок маленькие иконки с примерно 20 КБ размера и расположены в растяжимой-nodpi. Таким образом, Android не должен ничего делать, чтобы масштабировать их. Запуск приложения и просто переход между двумя действиями, показывающими эти четыре ImageButtons несколько раз, достаточно для запуска OOM. Деятельность начинаются обычно с определенным launchMode по:

startActivity(new Intent(this, MyActivity.class)); 

Не Android должен Destory деятельности в настоящее время не используется для того, чтобы освободить память. Вместо этого я получаю график использования памяти следующим образом: Memory Usage

Каковы эффективные методы снижения ресурсов, необходимых для повторяющихся ImageButtons? Есть ли способ для меня явно удалить их, например, onDestory()?

ответ

0

no-dpi означает, что он не предназначен для масштабирования плотности, а не «он не масштабируется вообще, когда-либо».

Если у вас есть 1 пиксель no-dpi, то вы можете отображать его на 640x480 (масштабирование по размеру или обложке), android расшифровывает ресурс при 640 * 480 * 4 байтах = ~ 1,2 МБ. Кажется, что у вас около 55 и 35 МБ, поэтому я предполагаю, что вы масштабируете их на весь экран или, по крайней мере, по большому счету.

Запуск нового действия снова и снова будет составлять стек. Поскольку вы все еще активны в одном стеке задач (вы просто добавляете его поверх), Android не просто уничтожит действие; это отличается от перехода на другой стек задач (прочитайте: запустите другое приложение, которое помещает это приложение в фоновый режим).

Переработка ресурсов обрабатывается классами ImageButton и Button, поэтому вам не нужно явно обращаться с этим. Если вы хотите сделать это в ручную:

  • не раздувать вытяжке в макете (так удалить drawableXXX=... или src=...)
  • загрузки изображения с помощью Bitmap.decodeResource
  • здесь вы можете установить малые размеры и BitmapFactory.Options
  • вручную вызвать Bitmap#recycle, когда вы сделали

Если вы загрузите их в onCreate, перерабатывают в onDestroy; если вы загрузите их в onStart, переработайте в onStop; если вы загрузите их в onResume, переработайте в .

+0

Изображения значков, используемые с ImageButtons, находятся около 600x600 и отображаются рядом друг с другом в нижней части экрана, см.: Http://i.imgur.com/VE0hEzX.png Поскольку рециркуляция обрабатывается сам ImageButton, это просто проблема, исходящая из чертежей, находящихся в неправильном каталоге? – user6334495

+0

Я на самом деле предполагаю, что происходит что-то еще. Использование памяти для одной кнопки нелепо. Честно говоря, поскольку это не векторные изображения (или большие фоновые изображения), я бы поместил их в mdpi и позволил андроиду масштабировать их для плотности. Это будет выглядеть лучше. –

Смежные вопросы