Android: java.lang.OutOfMemoryError:

Desarrollé una aplicación que usa muchas imágenes en Android.

Hay muchas imágenes presentes en la carpeta dibujable decir más de 100, estoy desarrollando una aplicación para la animación de imágenes. Utilicé imageview para mostrar imágenes GIF. He utilizado el concepto de imágenes Split gif en múltiples imágenes en formato PNG y luego lo uso.

Cada vez que el usuario ingresa a la aplicación, puedo ver que la memoria crece cada vez más hasta que el usuario obtiene java.lang.OutOfMemoryError .

Entonces, ¿cuál es la mejor / correcta forma de manejar muchas imágenes?

A continuación está mi código:

dog_animation.xml

   

dog_animation.xml (carpeta extraíble)

  

                                                          

Dog_Animation.java

 public class Dog_Animation extends Activity { Timer timer = new Timer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.dog_animation); ImageView img = (ImageView) findViewById(R.id.dog_animation); img.setBackgroundResource(R.drawable.dog_animation); AnimationDrawable frameAnimation = (AnimationDrawable) img .getBackground(); frameAnimation.start(); timer.schedule(new TimerTask() { public void run() { Intent intent = new Intent(Dog_Animation.this, Man_Animation.class); startActivity(intent); } }, 10000); } } 

Ahora el problema es cuando trato de moverme de una actividad a otra que tiene otra imagen para animar me está dando el error de java.lang.OutOfMemory .

Lo he intentado con tantas soluciones diferentes como

 @Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.DogView)); System.gc(); } private void unbindDrawables(View view) { if (view.getBackground() != null) { view.getBackground().setCallback(null); } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } } 

y también otras, pero ninguna solución no funciona para mí. Porfavor ayudame a resolver este problema. incluso he referido http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/ este enlace pero no se ha resuelto el problema.

En su AndroidManifest.xml mantenga esta etiqueta dentro de la aplicación, agregue largeHeap de esta manera:

  

Intenta detener tu animación en onPause (). hay una gran posibilidad de que no obtenga el GCED por eso. también optimice sus mapas de bits usando este sitio http://tinypng.org , si no necesita la capa alfa, configúrela en 24 bits

Reemplazar:

 img.setBackgroundResource(R.drawable.dog_animation); 

Por:

 img.setImageBitmap(decodeSampleBitmapFromResource(R.drawable.dog_animation, width, height)); //dont forget to replace width and heigh by your imageview dimension 

Un complemento:

 public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } 

y

 public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } 

Esto es de: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

En la respuesta anterior, getResources() un getResources() en

 img.setImageBitmap(decodeSampleBitmapFromResource(R.drawable.dog_animation, width, height)); 

entonces se vuelve

 img.setImageBitmap(decodeSampleBitmapFromResource(getResources(), R.drawable.dog_animation, width, height)); 
 try { //Code here that cause OutOfMemoryError } catch (Error ee) { ee.printStacktrace(); }