DrawableAnimation gibt OutOfMemoryError aus

  • DrawableAnimation gibt OutOfMemoryError aus

    Hallihallo,
    kann es sein, dass eine Drawable animation nur begrenzt Bilder fassen kann ? Ich habe in meiner Animation list 25 Bilder und AS gibt mir beim Versuch die DrawableAnimation abzuspielen folgenden Fehler aus:

    Quellcode

    1. java.lang.OutOfMemoryError: Failed to allocate a 17539572 byte allocation with 4194304 free bytes and 4MB until OOM
    Nach meinem Verständnis heißt das, dass es zu viele bzw. zu große Bilder sind, oder liege ich da falsch.
    Kann ich das irgendwie umgehen ?
    Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen...
  • Hi Slartibartfast,

    Die Anzahl der Bilder, welche die App fassten kann, ist abhängig vom Speicher der ihr zur Verfügung steht. Du kannst als Quickfix folgendes versuchen:

    1.) Den RAM von deinem AVD hoch schrauben
    2.) In deine Manifest largeHeap = true setzen (developer.android.com/guide/to…/application-element.html)

    3.) Die Bilder schmaler machen. Wie groß sind diese aktuell?


    Weitere Infos zum Thema findest du auch hier: developer.android.com/topic/performance/graphics/index.html


    youtu.be/p3wmLvxVomk

    Aktuelles YouTube-Projekt. Eine Lern- und Mitmachserie zum Thema Mobile Development. Wir bauen eine Bewerbungs-App.
  • Meine Bilder sind schon sehr kleine Dateien (zwischen3 und 5 kB).
    Ich hab das ganze jetzt umgeschrieben und aus dem assets geladen:

    Quellcode

    1. public void loadGameOverAnimation(){
    2. for (int x=2; x<64; x++){
    3. try {
    4. InputStream ims = getAssets().open("img/game_over/game_over"+x+".png");
    5. // load image as Drawable
    6. Drawable d = Drawable.createFromStream(ims, null);
    7. // set image to AnimationDrawable
    8. gameOverAnimation.addFrame(d, 50);
    9. Log.i("GameActivity", "Frame " +x+ " added to gamOverAnimation");
    10. ims.close();
    11. }
    12. catch(IOException e) {
    13. e.printStackTrace();
    14. Log.w("GameActivity", "IOException occured in gameOver()");
    15. }
    16. }
    17. }
    18. public void gameOver(){
    19. gameOverAnimation.start();
    20. new Handler().postDelayed(new Runnable() {
    21. @Override
    22. public void run() {
    23. for (int x=2; x<64; x++)
    24. gameOverAnimation.stop();
    25. finish();
    26. }
    27. },3200);
    Alles anzeigen
    jetzt spielt er das ganze auch einmal ab (hurray ;) )
    nur jetzt gibt er mir wieder einen OutOfMemory Error aus, wenn er das ganze ein zweites mal ausgeben soll.
    Im nächsten Beitrag poste ich die Logfiles.
    Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen...
  • Siehe Post über diesem.
    So hier sind die Logfiles:


    Logfiles schrieb:

    05-16 18:33:12.908 6126-6126/slartbart.example I/GameActivity: Frame 2 added to gamOverAnimation
    [...]
    05-16 18:33:13.219 6126-6137/slartbart.example
    I/art: Background sticky concurrent mark sweep GC freed 62(2840B)
    AllocSpace objects, 0(0B) LOS objects, 0% free, 58MB/58MB, paused
    7.416ms total 20.870ms
    [...]
    05-16 18:33:13.254 6126-6137/slartbart.example
    I/art: Background partial concurrent mark sweep GC freed 74(3KB)
    AllocSpace objects, 0(0B) LOS objects, 5% free, 63MB/67MB, paused
    5.422ms total 26.184ms
    [...]
    05-16 18:33:13.393 6126-6137/slartbart.example
    I/art: Background sticky concurrent mark sweep GC freed 49(2248B)
    AllocSpace objects, 0(0B) LOS objects, 0% free, 82MB/82MB, paused
    5.572ms total 16.861ms
    [...]
    05-16 18:33:13.691 6126-6137/slartbart.example
    I/art: Background partial concurrent mark sweep GC freed 102(4KB)
    AllocSpace objects, 0(0B) LOS objects, 3% free, 123MB/127MB, paused
    8.113ms total 46.390ms
    05-16 18:33:13.704 6126-6126/slartbart.example I/GameActivity: Frame 63 added to gamOverAnimation
    05-16 18:33:13.708 6126-6126/slartbart.example I/GameActivity.onCreate: GameActivity has started
    05-16
    18:33:13.817 6126-6126/slartbart.example I/Choreographer: Skipped 64
    frames! The application may be doing too much work on its main thread.
    [...]
    05-16 18:33:17.969 6126-6126/slartbart.example I/GameActivity: Frame 2 added to gamOverAnimation
    [...]
    05-16 18:33:18.388 6126-6126/slartbart.example I/GameActivity: Frame 37 added to gamOverAnimation
    05-16 18:33:18.390 6126-6126/slartbart.example I/art: Waiting for a blocking GC Alloc
    05-16 18:33:18.395 6126-6137/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.395 6126-6126/slartbart.example I/art: WaitForGcToComplete blocked for 5.336ms for cause Alloc
    05-16 18:33:18.395 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.395 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.410 6126-6126/slartbart.example
    I/art: Alloc sticky concurrent mark sweep GC freed 0(0B) AllocSpace
    objects, 0(0B) LOS objects, 0% free, 190MB/192MB, paused 1.686ms total
    14.194ms
    05-16 18:33:18.412 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.427 6126-6126/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.427 6126-6126/slartbart.example
    I/art: Alloc partial concurrent mark sweep GC freed 28(968B) AllocSpace
    objects, 0(0B) LOS objects, 0% free, 190MB/192MB, paused 938us total
    15.097ms
    05-16 18:33:18.428 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.446 6126-6126/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.446 6126-6126/slartbart.example
    I/art: Alloc concurrent mark sweep GC freed 5(152B) AllocSpace objects,
    0(0B) LOS objects, 0% free, 190MB/192MB, paused 1.039ms total 17.667ms
    05-16 18:33:18.448 6126-6126/slartbart.example I/art: Forcing collection of SoftReferences for 1903KB allocation
    05-16 18:33:18.448 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.470 6126-6126/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.470 6126-6126/slartbart.example
    I/art: Alloc concurrent mark sweep GC freed 3(72B) AllocSpace objects,
    0(0B) LOS objects, 0% free, 190MB/192MB, paused 2.489ms total 22.250ms
    05-16
    18:33:18.471 6126-6126/slartbart.example W/art: Throwing
    OutOfMemoryError "Failed to allocate a 1948852 byte allocation with
    1749280 free bytes and 1708KB until OOM"
    05-16 18:33:18.471 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.471 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.491 6126-6126/slartbart.example
    I/art: Alloc sticky concurrent mark sweep GC freed 4(536B) AllocSpace
    objects, 0(0B) LOS objects, 0% free, 190MB/192MB, paused 1.670ms total
    20.034ms
    05-16 18:33:18.492 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.508 6126-6126/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.509 6126-6126/slartbart.example
    I/art: Alloc partial concurrent mark sweep GC freed 6(144B) AllocSpace
    objects, 0(0B) LOS objects, 0% free, 190MB/192MB, paused 4.587ms total
    15.754ms
    05-16 18:33:18.516 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.548 6126-6126/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.549 6126-6126/slartbart.example
    I/art: Alloc concurrent mark sweep GC freed 3(72B) AllocSpace objects,
    0(0B) LOS objects, 0% free, 190MB/192MB, paused 4.776ms total 31.696ms
    05-16 18:33:18.550 6126-6126/slartbart.example I/art: Forcing collection of SoftReferences for 1903KB allocation
    05-16 18:33:18.550 6126-6126/slartbart.example I/art: Starting a blocking GC Alloc
    05-16 18:33:18.582 6126-6126/slartbart.example I/art: Clamp target GC heap from 194MB to 192MB
    05-16 18:33:18.582 6126-6126/slartbart.example
    I/art: Alloc concurrent mark sweep GC freed 3(72B) AllocSpace objects,
    0(0B) LOS objects, 0% free, 190MB/192MB, paused 3.383ms total 30.979ms
    05-16
    18:33:18.584 6126-6126/slartbart.example W/art: Throwing
    OutOfMemoryError "Failed to allocate a 1948852 byte allocation with
    1753256 free bytes and 1712KB until OOM"
    05-16 18:33:18.585 6126-6126/slartbart.example D/AndroidRuntime: Shutting down VM
    05-16 18:33:18.588 6126-6126/slartbart.example E/AndroidRuntime: FATAL EXCEPTION: main Process: slartbart.example, PID: 6126
    java.lang.OutOfMemoryError: Failed to allocate a 1948852 byte
    allocation with 1753256 free bytes and 1712KB until OOM
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:620
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:455)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1155)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1122)
    at android.graphics.drawable.Drawable.createFromStream(Drawable.java:1108)
    at slartbart.example.GameActivity.loadGameOverAnimation(GameActivity.java:526)
    at slartbart.example.GameActivity.onCreate(GameActivity.java:98)
    at android.app.Activity.performCreate(Activity.java:6679)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    05-16 18:33:24.740 6126-6137/slartbart.example I/art: Clamp target GC heap from 192MB to 192MB
    05-16 18:33:38.920 6126-6133/slartbart.example W/art: Suspending all threads took: 10.928ms


    ich hab dass mal ein bisschen gekürzt :)
    Kann mir jemand helfen?
    Gibt es ne Möglichkeit die animation nach beendigung der Activity wieder aus dem RAM zu löschen?
    Oder bin ich komplett auf dem Holzweg ?
    Mit freundlichen Grüßen,
    Slarti.
    Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen...