Android setBackgroundResource causa excepción de la memoria

Estoy trabajando en una aplicación de libro de juego que muestra 12 vistas en un ViewPager. Este es mi PagerAdapter personalizado:

private class ImagePagerAdapter extends PagerAdapter { private int[] mImages = new int[] { R.drawable.copertinai, R.drawable.blui, R.drawable.azzurroi, R.drawable.rossoi, R.drawable.gialloi, R.drawable.verdei, R.drawable.rosai, R.drawable.grigioi, R.drawable.neroi, R.drawable.arancionei, R.drawable.marronei, R.drawable.violai, R.drawable.ulm }; @Override public int getCount() { return mImages.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == ((RelativeLayout) object); } @Override public Object instantiateItem(ViewGroup container, int position) { Context context = MainActivity.this; RelativeLayout relLayImageView = new RelativeLayout(context); relLayImageView.setBackgroundResource(mImages[position]); ((ViewPager) container).addView(relLayImageView, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); return relLayImageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((RelativeLayout) object); object=null; System.gc(); } } 

En algunos dispositivos causa una excepción de memoria al azar cuando esta línea de código se llama

 relLayImageView.setBackgroundResource(mImages[position]); 

Pero en todos los dispositivos veo algo así en el logcat cuando doy vuelta a las páginas:

 12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation 

La aplicación también se bloquea en algunos dispositivos para el mismo problema cuando en otra actividad establezco un recurso de fondo diferente para el diseño principal basado en la acción del usuario. Aquí el código:

  btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { colorButtons.get(indiceColoreAttuale).setBackgroundResource( unSelectedColorsRes[indiceColoreAttuale]); switch (index) { case 0: mainLayout.setBackgroundResource(R.drawable.blus); break; case 1: mainLayout .setBackgroundResource(R.drawable.azzurros); break; case 2: mainLayout .setBackgroundResource(R.drawable.rossos); break; case 3: mainLayout .setBackgroundResource(R.drawable.giallos); break; case 4: mainLayout .setBackgroundResource(R.drawable.verdes); break; case 5: mainLayout .setBackgroundResource(R.drawable.rosas); break; case 6: mainLayout .setBackgroundResource(R.drawable.grigios); break; case 7: mainLayout .setBackgroundResource(R.drawable.neros); break; case 8: mainLayout .setBackgroundResource(R.drawable.arancios); break; case 9: mainLayout .setBackgroundResource(R.drawable.marrones); break; case 10: mainLayout .setBackgroundResource(R.drawable.violas); break; } mainLayout.startAnimation(animationShowTextColor); mainLayout.setGravity(Gravity.CENTER_HORIZONTAL); indiceColoreAttuale = index; colorButtons.get(index).setBackgroundResource( selectedColorsRes[index]); } }); 

Ejecuta excepiton otra vez cuando llamo setBackgroundResource () en mainLayout.

Espero que pueda ayudarme a resolver esto, gracias de antemano!

¡Lo resolví! Todas tus sugerencias eran buenas, pero el verdadero problema era la carpeta "/ drawable"! Tenía todas las imágenes en "/ drawable" carpeta genérica que es considerado por el sistema como "/ drawable / mdpi", por lo que cuando corría en dispositivos con hdpi o más las imágenes fueron cambiadas de tamaño, y se convirtió en demasiado grande que causa OutOfMemoryException!

Ahora estoy usando "/ drawable-nodpi" para almacenar mis imágenes. Esta carpeta funciona como "/ drawable" pero las imágenes nunca se redimensionan!

Cada aplicación de Android tiene memoria limitada (montón) que puede utilizar Dalvik VM. Es de 32 MB en algunos dispositivos es de 64 MB. Cuando se establece el recurso de fondo que carga ese recurso en montón. Ese recurso se carga como mapa de bits – su tamaño es el ancho * altura * tamaño de píxel. Normalmente los mapas de bits se cargan como imágenes ARGB que tienen 4 bytes por píxel. Significa que la carga de la imagen 1024×768 toma 1024 * 768 * 4 = 3145728 B = 3072 kB = 3 MB en el montón. Cuando se carga gran cantidad de imágenes grandes que consume toda la memoria de montón libre y causas de excepción de memoria.

Para arreglar esto es mejor cargar imágenes tan pequeñas como puedas – cuando estás mostrando miniatura de imagen es suficiente para cargarlo en resolución que no es mucho mayor que la resolución de la parte concreta de la pantalla. Esto significa que cuando usted exhibe su imagen en la exhibición 800×600 no es suficiente para cargar la imagen 1024×768. Puede utilizar BitmapFactory para cargar imagen en resolución más pequeña.

Utilice el método decodeResource (activity.getResources (), R.drawable.imageId, opts) . BitmapFactory.Options opts tiene el parámetro inSampleSize donde puede establecer el submuestreo de la imagen. También el parámetro inPreferredConfig se puede usar para configurar RGB_565 en lugar de ARGB_8888 en caso de que no necesite transparencia.

  • Manejo de fugas de memoria Xamarin.Forms
  • Android Universal Image Loader - ¿Cómo configuro las especificaciones correctamente?
  • Excepción de objetos muertos de Android
  • Android.database.CursorWindowAllocationException: La asignación de ventana de cursor de 2048 kb falló incluso después de cerrar el cursor
  • Android: AlertDialog provoca una pérdida de memoria
  • Pasando referencia a la actividad a la clase de utilidad android
  • Consulta sobre "dumpsys meminfo" en android
  • Android: liberación de la memoria asignada AnimationDrawable está utilizando hasta
  • Fuera de los errores de memoria se producen con un tamaño de montón alto pero tamaño asignado bajo. ¿Por qué?
  • Filtro de mercado para clase de memoria
  • ¿Este patrón de mensajería de Servicio de Actividad causa una pérdida de memoria?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.