OutOfMemoryError: размер растрового изображения превышает бюджет VM: - Android
Возможный дубликат:
Android: Странная проблема с памятью при загрузке изображения в объект Bitmap
Я загружаю изображения из Url и показываю их. Во время загрузки он дает out of memory error : bitmap size exceeds VM budget
. Я использую drawable. Код ниже:
HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap = Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();
Вот ошибка: 05-28 14:55:47.251: ERROR/AndroidRuntime(4188): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
Ответы
Ответ 1
Используйте decodeStream(is, outPadding, opts)
с помощью
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024];
Ответ 2
Вы можете проверить размер изображения, а затем уменьшить его с помощью соответствующего коэффициента.
Смотрите этот вопрос: Обработка больших растровых изображений
Ответ 3
Эта проблема, как представляется, была сообщена несколько раз, здесь и здесь, например...
извините Шалини, но если это та же проблема, кажется, что решения нет вообще...
Единственный совет Ромена Гая - использовать меньше памяти...
Так что, удачи, подумайте о своих вещах по-другому...
Ответ 4
Наконец, после повторной настройки изображения, как было предложено выше, вы можете вызвать bitmap_file.recycle().
Ответ 5
ФАКТ заключается в том, что на некоторых версиях Android существует ошибка, особенно в версии 2.1 с ошибками все время с такими проблемами.
Я выпустил приложение, в котором я много внимания уделял использованию ресурсов. Я даже удалил много растровых изображений, которые я использовал, и теперь они создаются "на лету" с использованием графических примитивов. Я также перерабатываю растровые изображения, когда их не используют. И, конечно, я проверил, что у меня нет утечек памяти в моем приложении: используемая память НЕ растет без контроля, она постоянно держится в разумных пределах.
Хотя я прилагаю много усилий для того, чтобы избежать этой проблемы, я продолжаю получать множество досадных исключений, подобных этим из устройств 2.1 и 2.1-update1. Я использую критический анализ, чтобы сообщать о сбоях, и я видел, что это происходит даже тогда, когда приложение использует только 4 мегабайта оперативной памяти, что в четыре раза меньше, чем 16 Мб размера кучи, которое должно иметь каждое устройство Android для приложения, - и факт заключается в том, что большинство устройств в наши дни имеют размеры кучи более 16 М -.
Все мои растровые изображения имеют размер 800x480 пикселей, что в худшем случае, поскольку ARGB_8888 может не занимать более 1,5 МБ каждый, но он падает, пытаясь загрузить его при занятии всего 4 мегабайт, поэтому должно быть не менее еще 12 МБ бесплатно. И большинство моих растровых изображений загружаются как ARGB_4444, который занимает половину памяти, я использую только ARGB_8888, когда растровые изображения выглядят очень плохо с 4444.
Итак, для меня довольно ясно, что на этих версиях Android есть что-то, что не работает нормально. 99'9% этих сбоев происходит от 2.1 и 2.1-обновления, а остальные могут быть объяснены другими пунктуальными причинами.
Ответ 6
Я пробовал много вещей, это то, что работает.
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true;
opts.inScale=8;
///after you use your images
System.gc();
Ответ 7
Это практический ответ, который я пытался избежать этой проблемы во время выполнения. И это также решило мою проблему.
Runtime.getRuntime().gc();
Calling Garbage Collector - хорошая идея.