2011-06-07 14 views
8

Nuestra aplicación utiliza muchos mapas de bits. Funciona bien, por ejemplo, en G1, XOOM. Pero en HTC Desire hay un error de OutOfMemory. En el código usamos try/catch (OutOfMemoryError e) y todos los dispositivos (excepto Desire) lanzan una excepción, pero HTC simplemente mata la aplicación sin excepción OOM. Restringimos la memoria para mapas de bits a 12 Mb y parecía que esta solución solucionó el problema, pero el cliente todavía tiene problemas con el HTC Desire HD. Hay OOM incluso con una restricción de 12 Mb. Éstos son los registros de:Cómo saber cuánto tamaño de montón está disponible para mapa de bits para Android 2. *?

06-07 12:03:43.978 E/dalvikvm-heap(29616):1140128-byte external allocation too large for this process. 
06-07 12:03:43.978 E/dalvikvm(29616):Out of memory: Heap Size=12311KB, Allocated=9420KB, Bitmap Size=12139KB, Limit=21884KB 
06-07 12:03:43.978 E/dalvikvm(29616):Trim info: Footprint=15751KB, Allowed Footprint=15751KB, Trimmed=3440KB 
06-07 12:03:43.978 E/GraphicsJNI(29616):VM won't let us allocate 1140128 bytes 

AFAIK hay diferentes limitaciones de tamaño del montón de dispositivos (G1: 16mb, Droid: 24 mb, Xoom 48 mb). En mi opinión, el sistema debería dar al menos 16 mb, pero tenemos OOM con 12mb. Mi pregunta es: ¿cómo saber cuántos tamaños de almacenamiento dinámico disponibles para mapa de bits para Android 2. *? O, por favor, infórmese sobre cómo evitar dicho problema de otras maneras. FYI no podemos usar menos bitmaps, especialmente cuando funciona bien en otros dispositivos. ¡Gracias de antemano por cualquier ayuda!

Respuesta

2

Usted puede intentar

Runtime.getRuntime().maxMemory(); 

o método de Actividad

getMemoryInfo(ActivityManager.MemoryInfo; 

Además, se puede reemplazar el método

onLowMemory(); 

de actividad, en la que se puede controlar lo que ocurrirá cuando la actividad recibe una notificación sobre el problema de memoria, antes de que se cierre. Y también debe verificar esto answer desde un desarrollador de Android en la memoria de Android/Linux.

+1

Los mapas de bits AFAIK se asignan en el montón externo. No sé si esos métodos le darán información del montón "normal" y externo de una aplicación. Ver también: [esta publicación.] (Http://stackoverflow.com/questions/1945142/bitmaps-in-android) – icyerasor

+0

De hecho están asignados en el montón nativo. Pero al menos para las versiones pre-Honeycomb de Bitmap, el código de bitmap nativo se asegura de reservar la misma cantidad de heap de Java (como una matriz) en caso de que los datos de píxel se soliciten desde el código de Java (a través de setPixel, getPixel, etc.). En ese caso, JNI copia los datos de píxeles nativos en el reino de Java, por lo tanto, también es necesario verificar el espacio de almacenamiento dinámico de Java disponible. – tiguchi

0

Esta excepción OutOfMemory proviene de una pérdida de memoria que no proviene del archivo. ¿Estás anulando los métodos del ciclo de vida de la actividad como onStop, onResume, onDestroy?

+2

No es como funciona en absoluto. Si intenta cargar una imagen de 8MP, provocará un OOM. No tiene que ser un código con fugas. – Bostwickenator

Cuestiones relacionadas