getView 는 화면에 뷰가 불리울 때 호출 되서 뷰를 그리잖아요..?
제가 하고싶은것은 이때 그린 뷰가 화면에서 벗어날때 뷰에 그린 이미지를 free 시켜주고 싶은데요...
화면에서 벗어나는 이벤트가 있을까요...?
그냥 이미지뷰를 보여줄땐 괜찮았는데....
gifView를 적용하였는데... 이것이 모든 프레임을 bitmap 화 하여 설정된 delay에 따라 nextFrame을 계속 그려주는 방식이라...
메모리를 많이 잡아먹더라구요...
그래서 용량 1메가쯤 되는 gif를 보게되면 3~4개만 봐도 메모리 에러가 나면서 죽더라구요 ㅠ_ㅠ
일단 gifView의 free() 함수는 모든 프레임을 리사이클 시키고 pause 상태값을 true로 바꿔주고 첫프레임 하나만 다시 보여주게끔
되어있습니다... 그리고 getView시에 다시 gif를 로딩하도록 되어있습니다...
그 홀더란 것이 저도 리스트뷰 최적화라 하여 적용을 해보았는데...
리스트뷰에서 어떤 행은 글만 있고 어떤 행은 글+이미지가 있고...
글을 올린 사람의 프로필 사진도 있고 한데....
홀더를 쓰면 이전 뷰가 이미지가 있다면 다음 뷰에 이미지를 또 빼줘야 하고...
프로필 사진같은경우 항상 존재하지만 이미지가 계속 다른데..
비동기로 이미지를 받을 경우 이전뷰에 그려진 프로필 사진이 떠있고
해당 프로필 사진을 다운로드 완료 하였을때 바뀌는 현상도 있고....
홀더를 써도 뷰를 다시 셋팅 해줘야 하는건 마찬가지인거 같아서 적용 안했거든요....
이게 문제가 될까요..?
LRU cache 를 사용해서 적재해야 합니다.
보여지고 있는것들은 큐에 쌓아서 보관을 하고 보여지지 않는 것들은 날려버려야 하겠지요..
보여지는건 getView에 의해서 불려지는 인덱스 포지션번호를 사용하면 됩니다.
아래 링크에서도 캐쉬를 사용했습니다.
http://android-developers.blogspot.kr/2010/07/multithreading-for-performance.html
네...
일반적인 한장짜리 이미지는 LRU캐쉬 방식으로 적재 하고 있습니다...
gifView 작동방식이 LRU캐쉬 방식을 적용하기 좀 까다로워서...
그냥 글을 하나 보고 다른대로 넘어가거나 다른글을 볼때 이전것을 항상 free 해주도록 하고싶었는데
적당한것을 찾았습니다...
애초에 listView 단에서 해당 gifView의 free()를 호출하려고 했던게 문제였었네요...
그냥 gifView에서 onDetachedFromWindow() 에서 free 시켜주도록 하니 화면마다 구현하지 않아도 잘 free가 되네여!!
답변 감사합니다 ^^




holder pattern은 적용되어 있는 것인지요?
이미 그려진 view는 다시 그릴필요가 없는데 또 그려서 더 그럴수도 있습니다.