Android: java.lang.OutOfMemoryError:

J'ai développé une application qui utilise beaucoup d'images sur Android.

Il y a beaucoup d'images présentes dans un dossier dédié, dis plus de 100, je développe une application pour l'animation d'images. J'ai utilisé la vision d'image pour afficher des images GIF. J'ai utilisé le concept de Split gif images en plusieurs images au format PNG, puis l'utiliser.

  • Android gradle build et la bibliothèque de support
  • RTSP youtube link
  • Activity.finish () appelé mais l'activité reste chargée dans la mémoire
  • Android HashMap dans Bundle?
  • Vérifiez par programme Check Play pour les mises à jour de l'application
  • Maven dit des plugins manquants: comment les installer?
  • Chaque fois que l'utilisateur entre dans l'application, je peux voir la mémoire de plus en plus jusqu'à ce que l'utilisateur obtienne le java.lang.OutOfMemoryError .

    Alors, quelle est la meilleure façon de gérer de nombreuses images?

    Voici mon code:

    Dog_animation.xml

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/DogView" android:orientation="vertical" > <ImageView android:id="@+id/dog_animation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.19" /> 

    Dog_animation.xml (dossier Drawable)

     <?xml version="1.0" encoding="utf-8"?> 

     <item android:drawable="@drawable/image" android:duration="50"/> <item android:drawable="@drawable/image1" android:duration="50"/> <item android:drawable="@drawable/image2" android:duration="50"/> <item android:drawable="@drawable/image3" android:duration="50"/> <item android:drawable="@drawable/image4" android:duration="50"/> <item android:drawable="@drawable/image5" android:duration="50"/> <item android:drawable="@drawable/image6" android:duration="50"/> <item android:drawable="@drawable/image7" android:duration="50"/> <item android:drawable="@drawable/image8" android:duration="50"/> <item android:drawable="@drawable/image9" android:duration="50"/> <item android:drawable="@drawable/image10" android:duration="50"/> <item android:drawable="@drawable/image11" android:duration="50"/> <item android:drawable="@drawable/image12" android:duration="50"/> <item android:drawable="@drawable/image13" android:duration="50"/> <item android:drawable="@drawable/image14" android:duration="50"/> <item android:drawable="@drawable/image15" android:duration="50"/> <item android:drawable="@drawable/image16" android:duration="50"/> <item android:drawable="@drawable/image17" android:duration="50"/> <item android:drawable="@drawable/image18" android:duration="50"/> <item android:drawable="@drawable/image19" android:duration="50"/> <item android:drawable="@drawable/image20" android:duration="50"/> <item android:drawable="@drawable/image21" android:duration="50"/> <item android:drawable="@drawable/image22" android:duration="50"/> <item android:drawable="@drawable/image23" android:duration="50"/> <item android:drawable="@drawable/image24" android:duration="50"/> <item android:drawable="@drawable/image25" android:duration="50"/> <item android:drawable="@drawable/image26" android:duration="50"/> <item android:drawable="@drawable/image27" android:duration="50"/> <item android:drawable="@drawable/image28" android:duration="50"/> <item android:drawable="@drawable/image29" android:duration="50"/> <item android:drawable="@drawable/image30" android:duration="50"/> <item android:drawable="@drawable/image31" android:duration="50"/> <item android:drawable="@drawable/image32" android:duration="50"/> <item android:drawable="@drawable/image33" android:duration="50"/> <item android:drawable="@drawable/image34" android:duration="50"/> <item android:drawable="@drawable/image35" android:duration="50"/> <item android:drawable="@drawable/image36" android:duration="50"/> <item android:drawable="@drawable/image37" android:duration="50"/> <item android:drawable="@drawable/image38" android:duration="50"/> <item android:drawable="@drawable/image39" android:duration="50"/> <item android:drawable="@drawable/image40" android:duration="50"/> <item android:drawable="@drawable/image41" android:duration="50"/> <item android:drawable="@drawable/image42" android:duration="50"/> <item android:drawable="@drawable/image43" android:duration="50"/> <item android:drawable="@drawable/image44" android:duration="50"/> <item android:drawable="@drawable/image45" android:duration="50"/> <item android:drawable="@drawable/image46" android:duration="50"/> <item android:drawable="@drawable/image47" android:duration="50"/> <item android:drawable="@drawable/image48" android:duration="50"/> <item android:drawable="@drawable/image49" android:duration="50"/> <item android:drawable="@drawable/image50" android:duration="50"/> <item android:drawable="@drawable/image51" android:duration="50"/> <item android:drawable="@drawable/image52" android:duration="50"/> <item android:drawable="@drawable/image53" android:duration="50"/> <item android:drawable="@drawable/image54" android:duration="50"/> <item android:drawable="@drawable/image55" android:duration="50"/> <item android:drawable="@drawable/image56" android:duration="50"/> 

    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); } } 

    Maintenant, le problème est quand j'essaie de passer d'une activité à l'autre qui a la même image pour animer qu'elle me donne une erreur de java.lang.OutOfMemory .

    J'ai essayé avec tant de solutions différentes comme

     @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(); } } 

    Et ainsi d'autres aussi, mais toute solution ne fonctionne pas pour moi. Aidez-moi à résoudre ce problème. Même si j'ai renvoyé http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceed-vm-budget/ ce lien mais pas pour résoudre le problème.

  • Comment puis-je m'assurer que la fenêtre affiche toujours le clavier sur le dessus?
  • La messagerie Cloud Firebase est-elle gratuite?
  • Cliquez sur les événements non enregistrés
  • KeyStore et Alias ​​clés
  • Qu'est-ce que layout_collapseParallaxMultiplier utilisé dans CollapsingToolbarLayout?
  • Android - Comment fermer une activité sur le clic de bouton?
  • 5 Solutions collect form web for “Android: java.lang.OutOfMemoryError:”

    Dans votre AndroidManifest.xml, conservez cette étiquette d'application interne, ajoutez grandHeap comme ceci:

     <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true"/> 

    Remplacer:

     img.setBackgroundResource(R.drawable.dog_animation); 

    Par:

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

    Une addition:

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

    et

     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); } 

    Ceci provient de: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    Essayez d'arrêter votre animation sur onPause (). Il y a une grande chance de ne pas avoir GCED à cause de cela. Optimisez également vos bitmaps en utilisant ce site http://tinypng.org , si vous n'avez pas besoin de la couche alpha, définissez-le à 24 bits

    Dans la réponse ci-dessus, il existe un getResources() absent

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

    Donc il devient

     img.setImageBitmap(decodeSampleBitmapFromResource(getResources(), R.drawable.dog_animation, width, height)); 
     try { //Code here that cause OutOfMemoryError } catch (Error ee) { ee.printStacktrace(); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.