Подтвердить что ты не робот

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

4b9b3361

Ответ 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]; 

Ответ 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 - хорошая идея.