Android setImageDrawable out of Memory

Я получаю ошибки нехватки памяти при использовании setImageDrawable для обновления изображения ImageView из ресурсов. Большинство других сообщений, посвященных stackru, которые я видел, намного сложнее, чем то, что я пытаюсь сделать. Для простоты я постараюсь сделать этот вопрос максимально простым.

Мое приложение имеет около 30 графических ресурсов, которые я хочу загружать в ImageView в разное время. Чтобы действительно сократить это, вот единственная строка оскорбительного кода:

((ImageView)findViewById(R.id.myimageview)).setImageDrawable(getResources().getDrawable(R.drawable.somerandomdrawable));

Когда я нажимаю различные кнопки, эта строка кода выполняется, чтобы обновить myimageview, чтобы показать новое изображение. В конце концов, мое приложение взрывается из-за нехватки памяти. Я не могу понять, почему Android не выпускает / не перерабатывает базовый чертеж / растровое изображение. По крайней мере, я не вижу, где здесь сильная ссылка.

На самом деле нельзя загружать эти растровые изображения в память (по 30 растровых изображений каждый 840-битный RGB 640x640), поскольку это немедленно взорвет приложение.

3 ответа

Ты пробовал это таким образом?

ImageView image = (ImageView)findViewById(R.id.myimageview);
image.setImageDrawable(getResources().getDrawable(R.drawable.somerandomdrawable));

Хорошо, думал, что я отвечу на свой вопрос здесь. Оказывается, мое приложение было разработано плохо и изначально загружало немало растровых изображений. Мое использование кучи после загрузки превысило 59 МБ! Осталось всего 6 Мб для игры.

Таким образом, при попытке загрузить / заменить определенные изображения imageView ресурсами, которые расширяются примерно до 1,6 МБ за штуку (изображения PNG 640x640), если бы я сделал это довольно быстро, я мог бы вызвать ситуацию нехватки памяти, прежде чем сборщик мусора имел возможность вернуть память.

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

В любом случае, надеюсь, это поможет кому-то еще. Спасибо за вклад, это помогло направить меня в правильном направлении.

У меня была похожая проблема ошибок памяти: после исследования я попробовал Picaso, и проблема исчезла. Http://square.github.io/picasso/

Другие вопросы по тегам