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개) |