마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰의 어댑터 getView에서 뷰를 재사용하지 않으면 누수가 나나요?

0 추천
궁금한게 있습니다.

 

보통 if(convertview != null){ 뷰인플레이트)

이런식으로 해서 getView에서 최초 뷰를 전개하고 그다움부터는 재사용하잖아요?

그런데 그렇게 하지 않고 위의 문장을 없애고

getView가 갱신될때마다 뷰를 inflate하게 하면

계속적인 뷰 생성으로 누수가 나나요?

아니면 GC에 의해서 정상적으로 수거가 되지만 뷰갱신 속도만 느려지는건가요?
갸아악 (21,260 포인트) 님이 2013년 4월 22일 질문

2개의 답변

0 추천
 
채택된 답변
getView 메소드에서 convertview 파라미터는 상위 List에서 사용중인 뷰를 재사용 하는 것입니다. 보통 ListView에서는 6~7개의 view를 만들어서 재사용하는데 이를 매번 생성하면 메모리와 속도면에서 좋지 않습니다. (ListView 사용법에서 제공하는 추천 방법이 convertview 재사용과 ViewHolder + tag 사용법입니다.)

Inflate는 생각보다 느리고 비쌉니다.
사살자 (1,500 포인트) 님이 2013년 4월 22일 답변
갸아악님이 2013년 4월 22일 채택됨
그럼 누수는 나지 않고 속도가 느려지는건가요?
제 앱에서 리스트뷰를 한장한장 넘기면
점점 메모리가 쌓여서요
메모리 누수가 난다면 해당 리스트에 들어가는 내용중에 비트맵이 있을가능성이 큽니다. 비트맵의 경우 gc나 recycle,  null 처리를 해줘도 제대로 메모리 해제가 안됩니다. 적절히 개발자가 로딩시간을 주거나 해서 처리를 해줘야 합니다. 인플레이트도 물론 뉴로 생성하기 때문에 메모리를 잡아먹습니다.
정확하십니다.
Bitmap관련 처리가 있습니다.
그런데 제가 정말 이상한건

위에 질문드린것처럼 뷰를 재사용했을때는 누수가 나지 않고,
뷰를 재사용하지 않을 경우에만 누수가 나서 메모리가 점점 쌓여서 뻗어버리더라구요.

그래서 제가 의심한건 뷰를 재사용하지 않으면 누수가 나는구나 이렇게 생각했거든요...
Log확인해보시면서 메모리 해제 되는걸 한번 확인 해보시길 바랍니다. 해제 해주는 시점이 언제인지 뷰를 재사용했을 때와 안했을 때 비교 해보시고 메모리를 어느정도 사용하는지 알면 알 수 있을거 같습니다.
사살자님의 조언 진심으로 감사드립니다.
복받으실꺼에요.^^
0 추천
제가 알기로는...달빅 머신이 경량화를 목표로 만들어져있기 때문에....

자바 가상머신만큼의  GC 성능은 기대하기 힘들며...

그래서 메모리 정리는 사용자가 직접 해줘야 하는 것으로 알고있습니다....

아무래도 임베디드 환경 상 메모리 관리가 추가된 가상 머신은 부담되겠지요...

그래서 뷰도 계속 재사용하는것이고...

뭐 말이 어지러워지긴 했는데 아무튼 갸아악님께서 질문하신 GC에 의해 정상적으로 수거가 되냐는 질문에

아니라는 대답을 드리고 싶어 댓글을 달아봅니다......
무적취객 (1,100 포인트) 님이 2013년 4월 22일 답변
...