OutOfMemoryError: el tamaño del bitmap excede el presupuesto de VM: – Android

Posible duplicado:
Android: extraño problema de memoria al cargar una imagen en un objeto Bitmap

Estoy descargando imágenes de la URL y mostrándolas. En el momento de la descarga, se está produciendo out of memory error : bitmap size exceeds VM budget . Estoy usando dibujable. El código está abajo:

 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(); 

Aquí está el error: 05-28 14:55:47.251: ERROR/AndroidRuntime(4188): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

Use decodeStream(is, outPadding, opts) con

 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]; 

Puede verificar el tamaño de la imagen y luego disminuirla por el factor apropiado.

Vea esta pregunta: Manejo de grandes mapas de bits

Este problema parece haber sido informado varias veces, aquí y aquí, por ejemplo … lo siento Shalini, pero si es el mismo problema, parece que no hay solución en absoluto …

El único consejo de Romain Guy es usar menos memoria …

Entonces, buena suerte para pensar sus cosas de manera diferente …

Finalmente, después de volver a muestrear la imagen como se sugirió anteriormente, puede llamar a bitmap_file.recycle () .

El hecho es que hay un ERROR en algunas versiones de Android, especialmente la versión 2.1 falla todo el tiempo con problemas como este.

Lancé una aplicación en la que he tenido mucho cuidado con el uso de los recursos. Incluso borré muchos mapas de bits que estaba usando y ahora se crean sobre la marcha utilizando primitivas gráficas. También reciclo bitmaps cuando no los utilizo. Y, por supuesto, he comprobado que no tengo pérdidas de memoria en mi aplicación: la memoria utilizada NO crece sin control, se mantiene todo el tiempo dentro de los valores razonables.

Aunque he invertido mucho esfuerzo en tratar de evitar este problema, continúo recibiendo muchas excepciones molestas como las de los dispositivos 2.1 y 2.1-update1. Estoy usando critercism ahora para informar lockings, y he visto que ocurre incluso cuando la aplicación usa solo 4 megabytes de RAM, cuatro veces menos que los 16M de tamaño de almacenamiento dynamic que debe tener cada dispositivo Android para una aplicación, y el hecho es que la mayoría de los dispositivos en estos días tienen tamaños de almacenamiento mayores de 16M-.

Todos mis mapas de bits tienen un tamaño de 800×480 píxeles, que en el peor de los casos, ARGB_8888 no ocupa más de 1.5MB cada uno, pero se bloquea al intentar cargar uno cuando tienen ocupados solo 4 megabytes, por lo que debe haber al menos otros 12 MB gratis. Y la mayoría de mis Bitmaps se cargan como ARGB_4444 que ocupa la mitad de la memoria, solo uso ARGB_8888 cuando los mapas de bits se ven realmente pobres con 4444.

Entonces, para mí, está bastante claro que hay algo en estas versiones de Android que no funciona bien. 99’9% de estos lockings provienen de las versiones 2.1 y 2.1, y el rest puede explicarse por otros motivos puntuales.

He intentado muchas cosas, esto es lo que funciona.

 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(); 

Esta es una respuesta práctica, lo que intenté evitar este problema en tiempo de ejecución. Y también resolvió mi problema.

 Runtime.getRuntime().gc(); 

Llamar al recolector de basura es una buena idea.