2016-12-05 4 views
0

私は実行、スリープ、ウォーク、ジャンプなどのスプライトアニメーションを持っています。これらのアニメーションはそれぞれ単独で動作しますが、setBackgroundResource()を使用してアニメーションを別のアニメーションセットに変更しようとすると、以前のアニメーションがアクティブな間にメモリの問題が発生します。以前のアニメーションセットがメモリから消去されていないと思います。メモリの問題を避けるために何ができるのですか?スプライトアクションアニメーションをOOMに実行せずにシームレスに変更する方法はありますか?

メモリエラー:

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.app.debug, PID: 5668 
java.lang.OutOfMemoryError: Failed to allocate a 5644812 byte allocation with 1290256 free bytes and 1260KB until OOM 
at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856) 
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675) 
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228) 
at android.content.res.Resources.loadDrawableForCookie(Resources.java:4215) 
at android.content.res.Resources.loadDrawable(Resources.java:4089) 
at android.content.res.Resources.loadDrawable(Resources.java:3939) 
at android.content.res.TypedArray.getDrawable(TypedArray.java:886) 
at android.graphics.drawable.AnimationDrawable.inflateChildElements(AnimationDrawable.java:324) 
at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:294) 
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:2549) 
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:2320) 
at android.content.res.Resources.loadDrawableForCookie(Resources.java:4210) 
at android.content.res.Resources.loadDrawable(Resources.java:4089) 
at android.content.res.Resources.getDrawable(Resources.java:2005) 
at android.content.res.Resources.getDrawable(Resources.java:1987) 
at android.content.Context.getDrawable(Context.java:464) 
at android.view.View.setBackgroundResource(View.java:18537) 

私は私のDrawableのフォルダに異なるアニメーションファイルを持っています。ここで私の実行XML設定です。コードで

anim_sprite_run.xml

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false"> 
    <item android:drawable="@drawable/run0001" android:duration="50" /> 
    <item android:drawable="@drawable/run0002" android:duration="50" /> 
    <item android:drawable="@drawable/run0003" android:duration="50" /> 
    <item android:drawable="@drawable/run0004" android:duration="50" /> 
    <item android:drawable="@drawable/run0005" android:duration="50" /> 
    <item android:drawable="@drawable/run0006" android:duration="50" /> 
    <item android:drawable="@drawable/run0007" android:duration="50" /> 
    <item android:drawable="@drawable/run0008" android:duration="50" /> 
    <item android:drawable="@drawable/run0009" android:duration="50" /> 
    <item android:drawable="@drawable/run0010" android:duration="50" /> 
    <item android:drawable="@drawable/run0011" android:duration="50" /> 
    <item android:drawable="@drawable/run0012" android:duration="50" /> 
    <item android:drawable="@drawable/run0013" android:duration="50" /> 
    <item android:drawable="@drawable/run0014" android:duration="50" /> 
    <item android:drawable="@drawable/run0015" android:duration="50" /> 
    <item android:drawable="@drawable/run0016" android:duration="50" /> 
    <item android:drawable="@drawable/run0017" android:duration="50" /> 
    <item android:drawable="@drawable/run0018" android:duration="50" /> 
    <item android:drawable="@drawable/run0019" android:duration="50" /> 
    <item android:drawable="@drawable/run0020" android:duration="50" /> 
    <item android:drawable="@drawable/run0021" android:duration="50" /> 
    <item android:drawable="@drawable/run0022" android:duration="50" /> 
    <item android:drawable="@drawable/run0023" android:duration="50" /> 
    <item android:drawable="@drawable/run0024" android:duration="50" /> 
    <item android:drawable="@drawable/run0025" android:duration="50" /> 
</animation-list> 

、私は10秒後、この

ivSprite.setBackgroundResource(R.drawable.anim_sprite_run); 
      ivSprite.post(new Runnable() { 
       @Override 
       public void run() { 
        mAnimationDrawable = (AnimationDrawable) ivSprite.getBackground(); 
        mAnimationDrawable.start(); 
       } 
      }); 

のような実行中のアニメーションを開始、私は睡眠アニメーションを参照するコードの別のスニペットを呼び出します。

ivSprite.setBackgroundResource(0); 
ivSprite.clearAnimation(); 
mAnimationDrawable.stop(); 

私は、以前のアニメーションをクリアするには、nullに背景を設定しよう:それは、私は次のことを試してみました睡眠アニメーションを呼び出す前に起因するOOM

ivSprite.setBackgroundResource(R.drawable.anim_sprite_sleep); 
      ivSprite.post(new Runnable() { 
       @Override 
       public void run() { 
        mAnimationDrawable = (AnimationDrawable) ivSprite.getBackground(); 
        mAnimationDrawable.start(); 
       } 
      }); 

にクラッシュする場所です。そして、私はclearAnimation()を呼び出して余分な保証をします。最後に私は以前のアニメーションを止めます。これはOOMエラーを防止するものではなく、私はアイデアがありません。

ご協力いただきありがとうございます。

答えて

0

私は解決策を考え出しました。それは私が試みてきたすべての頂点です。

ただし、アニメーションをdrawable-nodpiに移動することは、OOMエラーを防ぐための鍵と思われます。 Androidはデフォルトで/ drawable-mdpiというリソースを想定している可能性があります。

さらに、メモリの管理に役立つコードを2行追加しました。私はmAnimationDrawableオブジェクトをnullにし、ガベージコレクタも呼び出します。うまくいけば、これらのソリューションはスプライトアニメーションを扱う他の人に役立つでしょう。乾杯!

ivSprite.setBackgroundResource(0); 
ivSprite.clearAnimation(); 
mAnimationDrawable.stop(); 
mAnimationDrawable = null; 
// invoke garbage collector 
System.gc(); 
関連する問題