2016-12-05 1 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) 

내 그리기 폴더에 다른 애니메이션 파일이 있습니다. 여기 내 실행 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> 

, 나는이

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

10 초 후에 같은 실행중인 애니메이션, 내가 잠 애니메이션을 참조 코드의 또 다른 조각을 전화를 시작합니다.

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 오류를 방지하는 열쇠 인 것처럼 보입니다. 안드로이드는 기본적으로/drawable-mdpi와 같은 리소스를 사용하고있을 수 있습니다.

또한 메모리 관리에 도움이되는 몇 줄의 코드를 추가했습니다. 내 mAnimationDrawable 객체를 null로 만들고 garbage collector도 호출합니다. 이러한 솔루션이 스프라이트 애니메이션 작업에 도움이되기를 바랍니다. 건배!

ivSprite.setBackgroundResource(0); 
ivSprite.clearAnimation(); 
mAnimationDrawable.stop(); 
mAnimationDrawable = null; 
// invoke garbage collector 
System.gc(); 
관련 문제