BitmapFactory.Options에 보면 inPurgeable이라는 속성이 있습니다.
이 속성을 true로 적용한 bitmap 객체는 시스템이 메모리를 돌려받기를 원할때 메모리에서 제거될 수 있도록 생성됩니다.




이 속성이 적용된 예제를 참고해서, sdcard에 있는 이미지를 로드해서 사용하는 커스텀 이미지뷰를 만들어보았습니다.

사실, Frame animation을 사용하지 않으면 Bitmap사용중 OutOfMemory가 자주 발생하지는 않습니다.
이를 해소해보려고 ImageView에 purgeable 옵션이 true로 적용된 bitmap을 사용해서 frame animation을 사용하도록 해주는 커스텀 이미지뷰를 만들었습니다.
목표는 자동으로 메모리를 관리하는 이미지뷰를 사용하게 되는것입니다.


 참고자료
 - PurgeableBitmap.java 
 - PurgeableBitmapView.java
 


PurgeableImageView의 사용은 아래와 같은 프로세스로 처리됩니다.




 class PurgeableImageView extends ImageView



새로이 추가된 세가지 메소드는 setFilePath(String[]), update(), recycle() 입니다.
setFilePath()는 이미지파일의 경로를 입력받는 메소드이고,
update()는 이미지파일경로로 부터 bitmap을 생성하고 ImageView에 뿌려주는 메소드입니다.
recycle()은 bitmapArray[]에 있는 bitmap들을 recycle하여 메모리를 확보해주는 메소드입니다.



 class RefreshHandler extends Handler



새롭게 추가된 메소드는 sleep(long)입니다.
기존에 있었던 handleMessage(Message)가 이미지뷰를 업데이트하고 화면에 뿌려지는 bitmap을 교체한후, sleep으로 잠시동안의 딜레이를 준 뒤, 다시 handleMessage()를 호출하는 방식입니다.


이 두가지 클래스를 적절히 사용하면, OutOfMemory가 발생하지 않는 frame animation을 구현할 수 있습니다.



테스트 결과
 테스트 조건
 갤럭시S(SK) / 갤럭시S2(SK) / 넥서스S
 액티비티 하나가 가진 이미지뷰  : 33개
 화면에 한번에 보여지는 이미지뷰의 갯수 : 4~7개
 이미지뷰가 가진 filePath : 2개
 
 테스트 결과
 OutOfMemory발생없이 평균 20~40개 이상의 액티비티 연속 실행 가능. (테스트 시 최대 81개)


'Android > Bitmap' 카테고리의 다른 글

[Android] Bitmap's purgeable option - OutOfMemory problem  (4) 2011.11.02
Posted by croute

댓글을 달아 주세요

  1. 사용자 2012.04.04 10:39  댓글주소  수정/삭제  댓글쓰기

    이거 사용법이 어떻게되나요..제가 잘못사용하는지 모르겠는데

    프레임 애니메이션에 적용하니가 잘안되네요

    • Favicon of https://croute.me BlogIcon croute 2012.04.04 10:54 신고  댓글주소  수정/삭제

      이건 프레임 애니메이션에서 OutOfMemory error 발생하는것에 대한 대책으로 사용할만한 방법입니다.

      프레임 애니메이션에서 사용하는게 아니구요.

      프레임 애니메이션은 자동으로 몇장의 이미지를 교체해준다면,
      이 방법은 프로그래머가 수동으로 코드에서 이미지를 교체해준다는 방식입니다.

  2. 사용자 2012.04.04 14:27  댓글주소  수정/삭제  댓글쓰기

    넵 수동으로 교체해주는 방식은 인지하고 있는데.. 사용법이 좀 애매한거 같아서 여쭈어봅니다

    제가 보기에는 setfilepath 에서 String형의 path들을 넣어주는거 같은데 아래부분의

    recycle 함수에서 호출하는부분에 bitmapArray가 null이라서 에러나는부분이 존재하였으며

    refresh핸들러에서는 visibleImageList 라는 array는 존재하지않는거 같은데 사용되고

    그래서 큰 그림이 안그려지고있습니다.. 그래서 사용법을 물어봤습니다..