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
- Referencia débil para la llamada de red mala idea?
- Tutoriales o ejemplos para la depuración de la memoria de Android
- ¿Por qué el tamaño de mapa de bits es más grande en la memoria que en el disco en Android?
- Android NDK: Dalvik Heap y Native Heap - Cómo separar entre los dos
- Fuga de memoria de Android Drawables
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!
- Los archivos masivos de hprof que se crean de alguna manera, me impide empujar
- Android ADT 21.0.0. Fugas de memoria en el diseño gráfico
- ¿Será este ejemplo de Android seguro de usar, la memoria de fugas?
- Memoria interna llena de imágenes, probablemente causada por Bitmap.compress (formato, int, flujo)
- Cómo calcular programaticamente todo el tamaño de caché de la aplicación instalada?
- Límite de tamaño de Android montón, todavía tenemos necesidad de diseñar aplicaciones con un límite de 16 MB en mente?
- ¿Hay una manera de compactar memoria en android para bajar la marca de agua alta?
- Fuga de memoria a través de IClipboardDataPasteEventImpl
¡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.
- Cómo iniciar la pantalla de inicio mediante programación en Android
- Unwanted Warp efecto de dibujo de texto en la ruta android