Android sin memoria al asignar variables
Así que tengo esto:
'01-01 20:37:34.859: E/dalvikvm-heap(19921): Out of memory on a 6471856-byte allocation.'
Al intentar asignar un montón de variables a la memoria. Estoy asignando 24 variables como estas:
- Android - comprimir mapa de bits antes de guardarlo en SDCARD en actividad para obtener resultados
- ¿Qué es lo que hace Bitmap # recycle () en Android Honeycomb?
- Eclipse - diseñador de GUI Android increíblemente lento y con mucha memoria
- Android: ¿Cuánta memoria utiliza mi aplicación?
- eliminar vistas que no son visibles en gridView
mElements.add(new ShopElement(getResources(),R.drawable.shop_starter, b1X , b1Y,true,1,"red",true,5,checkLocked(0)));
Y uno de ellos:
bNumbers = new Bitmap[] {Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h0) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h2) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h3) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h4) ,65,65,true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h5) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h6) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h7) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h8) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h9) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.time) , 50,50, true)};
Pero antes de que pueda obtener a través de # 16 de los 24 elementos que estoy creado, se bloquea en ciertos teléfonos.
Tengo un Galaxy S2 y funciona bien, pero en el S3 y otros teléfonos se bloquea.
Estaré encantado de proporcionar más información a petición.
He buscado este error antes, intentado aplicar soluciones, y miró a través de la "Visualización de Bitmaps Efficiently" cosa, pero nada parece ayudar.
Lo que hace girar mi cabeza es que funciona en el S2, pero no en el S3. ¿No debería el S3 exceder el S2 en todos los sentidos?
Estoy utilizando un BitmapFactory.Options global para dibujar todos mis mapas de bits que establecer las opciones de la siguiente manera:
Global.opts = new BitmapFactory.Options(); Global.opts.inDither=false; Global.opts.inPurgeable=true; Global.opts.inInputShareable=true; Global.opts.inTempStorage=new byte[16 * 1024];
- Cómo borrar la vista creada dinámicamente de la memoria?
- Android - es onDestroy supone destruir la actividad, sus variables y liberar memoria
- Android: Fuera de error de memoria
- Un explaniton más profundo de procstats para Android
- declaración no válida en fillwindow () en Android
- Cómo corregir este error: java.lang.OutOfMemoryError
- La mejor manera de evitar pérdidas de memoria en el fragmento android
- Cómo utilizar Leak Canary
Simplemente usted está tratando de acceder a más memoria que usted tiene. Así que la solución sería aumentar la memoria o utilizar sólo la memoria disponible .
Tres sugerencias para hacerlo.
1) Si está utilizando BitmapFactory.Options
y todavía el error persiste entonces significa que usted no está usando la configuración apropiada de él para la imagen dada. Sólo asegúrese de que el tamaño de Heap es suficiente .
BitmapFactory.Options opts=new BitmapFactory.Options(); opts.inDither=false; //Disable Dithering mode opts.inSampleSize = 8; // scale image upto 1/8 of the original image. 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[16 * 1024]; //you can increase this value as per your need.
Puede aumentar el tamaño de inTempStorage
para que funcione o inSampleSize
la imagen utilizando el atributo inSampleSize
. Para más información sobre el muestreo, puede consultar este enlace .
Intente jugar con diferentes opciones. Deberia de funcionar.
2) También puede aumentar el tamaño total de Heap de la aplicación usando android: largeHeap = "true" atributo en el archivo de manifest
, pero esto no funcionará en ningún dispositivo pre Honeycomb. En los dispositivos pre 2.3, puede utilizar la clase VMRuntime.
3) Si desea detectar mediante programación el tamaño Heap y desea cambiarlo según la necesidad, puede seguir este enlace .
El error dice claramente que usted está intentando utilizar más memoria. Esto apunta directamente a los tamaños de imagen. Por lo tanto, es necesario cambiar el tamaño de las imágenes para utilizar menos memoria. Uno que se puede utilizar por esta razón es BitmapFactory.Option . O bien ir con manualmente el cambio de tamaño de sus imágenes tener cuidado de que se adapte a todas sus necesidades. Sólo por el bien de explicar las cosas,
Tamaño de montón es la cantidad de memoria asignada a una aplicación para ejecutar. El tamaño del montón para las aplicaciones de Android está determinado por la memoria RAM del dispositivo. Por ejemplo, si el dispositivo tiene RAM de 179 MB, las aplicaciones de Android sólo obtendrá el tamaño de montón de 18 MB.
Más información aquí . Más información sobre cómo cargar grandes mapas de bits eficientemente se encuentra aquí .
Tengo un Galaxy S2 y funciona bien, pero en el S3 y otros teléfonos se bloquea
Compruebe el tamaño de RAM de los dispositivos que ha mencionado.
En Android Memory Management, cada aplicación tiene una memoria máxima de montón que puede utilizar, una vez que la aplicación utiliza más de la memoria acumulada Android OS matará automáticamente la aplicación. Tan solamente usted está consiguiendo "fuera de la excepción de la memoria".
Para resolver esto puede ir para el concepto NDK de Android .. Dado que el concepto de montón es para la parte SDK ..
es decir,
Puede hacer que una aplicación utilice más de 300 MB (si está disponible) de RAM utilizando NDK, pero no es posible en SDK
- Obtener cadena, fecha, hora y int de sqlite base de datos en android
- Error al resolver la biblioteca en el estudio de Android