2010-05-28 15 views
53

Possible Duplicate:
Android: Strange out of memory issue while loading an image to a Bitmap objectOutOfMemoryError: tamaño de mapa de bits supera el presupuesto VM: - Android

estoy descargando imágenes desde URL y de mostrarlos. En el momento de la descarga, está dando out of memory error : bitmap size exceeds VM budget. Estoy usando dibujable. Código es el siguiente:

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

+0

¿Qué tan grande es la imagen? –

+0

Hola, Marcelo Cantos !!! ..height & width of image = 320x320 – Andy

+0

Averigüe de cuántas maneras puede obtener las imágenes para que no encuentre el problema de memoria –

Respuesta

2

Este problema parece que se ha informado en varias ocasiones, y herehere por ejemplo ... lo siento Shalini pero si es el mismo problema, parece que no hay una solución a todos ...

El único consejo de Romain Guy está to use less memory...

tanto, buena suerte para pensar tus cosas diferentes ly ...

+3

Existe una solución: use menos memoria que el máximo permitido. Sé que esta es una respuesta frustrante, pero los teléfonos no tienen una cantidad "ilimitada" de RAM como las máquinas de escritorio. Tienes que tener cuidado. –

+0

No sabía que vendría a la pila;) Como dije, su recomendación era usar menos memoria ... ¿Qué aconsejaría hacer para eso? reducir el tamaño de la imagen? – Sephy

31

Uso 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]; 
+0

¡Gracias, mi aplicación está funcionando ahora! – jucajl

+2

Gracias, estaba buscando una solución para los meses – sanjeev

-2

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

Runtime.getRuntime().gc(); 

Calling Garbage Collector es una buena idea.

+6

Esto no llama explícitamente al recolector de basura pero recomienda que la máquina virtual lo haga. – caw

+0

Si está perdiendo memoria, esto no hará absolutamente nada. Las recolecciones de basura solo reciclan objetos que no tienen nada más que cuelgue en una referencia a ellos. –

0

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 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 bloqueos, 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 dinámico 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 bitmaps tienen un tamaño de 800x480 píxeles, que en el peor de los casos, como ARGB_8888 no ocupan más de 1,5MB cada uno, pero se bloquea al intentar cargar uno cuando ocupan solo 4 megabytes, por lo que debe haber al menos otros 12 MB gratis. Y la mayoría de mis mapas de bits están cargados 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.

Por lo tanto, es bastante claro que hay algo en estas versiones de Android que es no funciona bien 99'9% de estos bloqueos provienen de las versiones 2.1 y 2.1, y el resto puede explicarse por otros motivos puntuales.

0

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

La solicitud de recolección de basura no limpiará una pérdida de memoria. –

Cuestiones relacionadas