Animation Drawable verursacht Fehler wegen ungenügenden Speicherplatzes auf den zweiten Lauf in Android

Ich bin derzeit ein Spiel zu entwickeln und ich versuche, verwenden Sie eine AnimationDrawable zeigen eine animation in mein Hauptmenü. Wenn ich das Spiel einmal, funktioniert es tadellos. Aber wenn ich Tippen Sie auf die zurück-Taste, wenn ich öffne das Spiel wieder, es gibt mir OutOfMemorryError.
Wenn ich auf home und gehen Sie zurück zu dem Spiel, es lädt aber nicht zeigen Sie die animation, es ist leer, wo es sein sollte.

Ich denke, wenn es geöffnet wird, das Spiel wieder zu laden versucht die animation, aber es ist schon geladen, aus der vorherigen Ausführung, kann ich frei, dass der Speicher irgendwie? Wie kann ich das behandeln, die Ausnahme?

Suchen, auf die ich finden kann, dass es ein Allgemeines problem bei Android, aber ich konnte nicht finden, dass irgendetwas nützlich.

Wenn es relevant ist, meine Bilder sind 310x316 und ich habe 114 frames geladen die animation wird geladen, in eine xml.

Mein MainMenu Klasse:

public class MainMenuActivity extends Activity{

 private String TAG = MainMenuActivity.class.getSimpleName();
 ImageView rabbitMenu ;
 AnimationDrawable ad;   

public 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.mainmenu);          
        rabbitMenu = (ImageView) findViewById(R.id.rabbitMenu);
        rabbitMenu.setImageResource(R.drawable.rabbit_menu_animation);
        ad = (AnimationDrawable) rabbitMenu.getDrawable();

    }

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);       
        ad.start();     

}
}

Error-log:

01-31 16:13:11.320: E/AndroidRuntime(19550): FATAL EXCEPTION: main
01-31 16:13:11.320: E/AndroidRuntime(19550): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-31 16:13:11.320: E/AndroidRuntime(19550):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-31 16:13:11.320: E/AndroidRuntime(19550):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:563)
01-31 16:13:11.320: E/AndroidRuntime(19550):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)

Edit:

Nachdem @OleGG Vorschlag und nun der zweite Lauf geht in Ordnung, aber auf dem Dritten Durchgang bin ich anscheinend versucht, einen Recycling-bitmap.

So gab ich mit AnimationDrawable, und ich AsncTask um mein problem zu lösen. Nun, ich halte das ändern der hintergrund der Bildansicht auf meine onProgressUpdate(). Möglicherweise nicht der beste Ansatz sein, aber ich bin mir jetzt nicht irgendwelche Probleme! Hier ist mein AsyncTask code falls jemand das gleiche Problem!

private class DrawRabbit extends AsyncTask<Void, Integer, Void> {
         private boolean running = true;
         private int fps = 24;
         private int frame = 10014;
         private String drawableName; 
         @Override
         protected Void doInBackground(Void... params) {


             while (running){
                 try {  
                    if (frame == 10014)
                        Thread.sleep(1000);
                    else 
                        Thread.sleep(fps);
                    if (frame < 10160) { 
                        frame++;
                        publishProgress(frame);
                    }
                    else 
                        running = false;

                } catch (InterruptedException e) {
                    //TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }               
             return null;
         }

         protected void onProgressUpdate(Integer... frame) {
             drawableName = "rm" + frame[0];
             int res_id = getResources().getIdentifier(drawableName, "drawable", getPackageName());          
             rabbitFrame.setBackgroundResource(res_id);
         }   
     }
  • So ist es 300x300x4, über 360 Kb pro Bild. Ich bin mir nicht sicher, wie die animation schafft es jedes frame Speicher, aber wenn es dauert nur ein wenig zu bereinigen die Erinnerung, es ist nicht überraschend, es läuft es ziemlich schnell.
  • Ich habe eine Klasse für die Anzeige von Animationen aus drawables: stackoverflow.com/a/12519216/525319
  • Sie ersparte mir viel Zeit,danke
  • Leider (wie ich entdeckt, nachdem der Versuch, dieses Konzept), AsynchTasks sind nicht garantiert, um zu warten, bis die Zeit, die Sie angeben. In der Praxis endete, dass Sie mir sehr abgehackte Animationen, darunter auch einige frames übersprungen. Es kann in einigen Fällen arbeiten, aber ich würde vorsichtig sein, wo Sie es verwenden.
InformationsquelleAutor caiocpricci2 | 2012-01-31
Schreibe einen Kommentar