Печально известный выпуск «Превосходит бюджет ВМ» - PullRequest
0 голосов
/ 30 ноября 2011

Итак, у меня есть приложение, которое зацикливается и непрерывно рисует множество файлов png на холсте.В конструкторе для потока для некоторых png я объявляю Drawable и некоторые растровые дескрипторы и назначаю их (соответственно) следующим образом:

 Drawablename = context.getResources().getDrawable(R.drawable.pngresource);
 mBackgroundImage = BitmapFactory.decodeResource(res, R.drawable.bckgrnd);

Имейте в виду, что я делаю оба метода, МНОГИЕ раз.(хотя большинство изображений довольно маленькие)

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

Из исследований я заметил, что это, кажется, общая проблема.(Приложение отлично работает на всех новых устройствах, таких как droid x, на каждом планшете, в лучшем случае покупайте, заряжайте, atrix и т. Д.)

Итак, мой вопрос, могу ли я сделать что-то лучше?Является ли один из этих методов ссылки на PNG лучше?Также что именно здесь происходит?Мне нужно иметь возможность ссылаться на изображение для рисования в любое время.Другими словами, в любой момент я мог вызвать Draw на одной из ручек.

Исправления, которые я видел для подобных проблем, включали вызов Сборщика мусора, но поможет ли это мне, так как мне понадобятся Изображения позже?Или это исключительно проблема с тем, как я ссылаюсь на png из папки drawable?

Извините, если это сбивает с толку, я новичок.

Если бы я вызывал System.gc () после каждой ссылки, это помогло бы, даже если ссылка все еще сохраняется как объект Drawable

1 Ответ

4 голосов
/ 30 ноября 2011

Общее исправление:

  1. Изменение размера изображения, например: createScaledBitmap() ...
  2. Уменьшение качества изображения, Config.inSampleSize настройка ...
  3. Удалять все ссылки на Bitmap объекты, когда они не используются (конечно, установка ссылок на NULL).Если вы этого не сделаете, System.gc() не сделает ничего, запомните это!и этот вызов метода не гарантирует, что память будет освобождена сразу.
...