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:

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

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

  • ¿Drawable toma menos memoria entonces un mapa de bits?
  • Problema de memoria de Viewview de Viewpager
  • Eclipse se bloquea con límite de gastos generales de GC superado después de enlazar servicios de Google Play
  • Memoria interna llena de imágenes, probablemente causada por Bitmap.compress (formato, int, flujo)
  • Alto uso de memoria RAM para la aplicación vacía de Android
  • Jit: Redimensionar JitTable de 512 a 1024 y así sucesivamente ... ¿qué es esto?
  • Servicio remoto, pérdidas de actividad al girar
  • Float o doble?
  • Pushwoosh filtrando mi actividad
  • Pocas pérdidas de memoria en Facebook SDK
  • ¿Cómo entender que muestra LeakCanary?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.