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/