안녕하세요
이번에 하드코어한 프레임 애니메이션 앱을 만들고 있는데요
약간 성능이 저급한(넥서스원) 같은 단말에서는 아웃오브 메모리를 뱉으면서 죽고마네요
프레임 이미지는 480x800 전체에 뿌리는 관계로 해당 스크린사이즈만큼의 이미지가 9장정도 됩니다..
9장의 이미지를 무한반복으로 보여주다가 다음버튼을 누루면 프레임 레이아웃이 변경되는 기능인데요
이부분에서 아웃오브메모리를 일으키면서 죽네요 ㅠ
모든 방법을 다 써봤는데... 잘안되네요... 다음 부분이 지금 최종으로 쓰고있는 부분입니다....
private void makeBackgroundAni()
{if(backgroundImageView.getBackground() != null)
{int count = bgAni.getNumberOfFrames();
for(int i =0; i< count; i++)
{Drawable frame = bgAni.getFrame(i);
if (frame != null)
{ if(((BitmapDrawable)frame).getBitmap().isRecycled()== false)
{((BitmapDrawable)frame).getBitmap().recycle();
}
}
frame = null;
}
backgroundImageView.getBackground().setCallback(null);
backgroundImageView.setBackgroundDrawable(null);
bgAni = null;
}
AnimationDrawable anidrawable = new AnimationDrawable();
anidrawable.setOneShot(false);
for(int i =0; i<9; i++)
{Bitmap bitmap = null;
bitmap = BitmapFactory.decodeFile(Config.IMAGE_FILE_DIR+String.format("ani_%d_%d.jpg", index+1, i));BitmapDrawable bitDrawable = new BitmapDrawable(getResources(), bitmap);
anidrawable.addFrame(bitDrawable, 1000);
}
backgroundImageView.setBackgroundDrawable(anidrawable);
bgAni = (AnimationDrawable)backgroundImageView.getBackground();
if(playerAniImageView.getBackground() != null)
{int count = playerAni.getNumberOfFrames();
for(int i =0; i< count; i++)
{Drawable frame = playerAni.getFrame(i);
if (frame != null)
{ if(((BitmapDrawable)frame).getBitmap().isRecycled()== false)
{((BitmapDrawable)frame).getBitmap().recycle();
}
}
frame = null;
}
playerAniImageView.getBackground().setCallback(null);
playerAniImageView.setBackgroundDrawable(null);
playerAni = null;
}
playerAniImageView.setBackgroundResource(backgroundAnis[Config.backgroundAniIds[index]]);
playerAni = (AnimationDrawable)playerAniImageView.getBackground();
}
backgroundImageView 와 playerAniImageView 가 프레임 애니메이션의 이미지 뷰이고
bgAni 와 playAni가 그걸 받아오는 AnimationDrawable 객체입니다... 이 함수를 다음버튼을 누루면
호출하게되어 교체하는 방식인데요.. 처음에는 간단하게 null만 넣어줘는데... 프레임마다 찾아가면서 recycle해주는코드도
추가해줘봐고요... 하아 어렵네요 메모리 관리

개발자는 기계가 아닙니다.
다음을 누르면 넘어가기 전에 현재 프레임만 놔두고 우선 모두 recyle 하시고
drawable도 애니메이션이 아닌 단일 (현재프레임...)로 사용하세요...
이게 완료된 다음에 다음으로 넘어가보세요...
거의 메모리 한계를 왔다갔다 하는 것으로 보이네요...
다음 애니메이션도 그정도 크기라면 바로 메모리 관리가 안되면 유지하기 힘들것으로 보입니다.
decodeFile 하실때 Options 객체를 같이 주시고 purgable이던가...
이걸 true로 주고 생성하시면 조금 나을지도 모르겠습니다.




안녕하세요 건방진프로그래머님
화면 전환(레이아웃 전환)하실 때 현재 프레임 에니메이션하는 비트맵을 모두 recycle 시키시면 되지 않을까하네요^^
프레임 에니메이션 > recycle all > 레이아웃 전환