누수땜에 이틀 고생하다가 해결하긴 햇는데..
정확한 원인과 그에따른 정확한 논리적인 해결방법을 이해하지 못하고 해결되서 짜증납니다..
선배님들 잠시만 시간내서 봐주시면 정말 고개숙여 감사드릴께요.
현재 플립보드 형태의 라이브러리로 작업을 하고 있습니다.
이 플립보드는 내부적으로 버퍼를 3개 가지고 있고,
이전이미지 현재이미지 다음이미지
이렇게 새개를 가지고 있습니다.. 그래야 한장한장 넘길때 부드럽거든요.
그리고 어댑터와 콘트롤러 다운로더 부분으로 나누어져 있습니다.
어댑터는 커스텀어댑터를 사용합니다.
지금까지 한장한장 이미지를 넘길대마다 메모리에서 객체가 해제가 안되고 계속 쌓여 뻗었었거든요.
참고로 한장한장 넘길때마다 new 다운로더(); 를 호출합니다.
그래서 가장 처음에는 다운로더 부분을 의심하였습니다.
Bitmap객체를 쓰고 잇었거든요.
그래서 고생고생하고 GC와 메모리에 관하여 공부하여
어댑터에서 전달되는 imageView와 다운로더 내부에서 쓰이는 Bitmap 객체에 대하여
WeakReferences 처리를 해주었습니다.
그래도 똑같더라구요..
계속 헤메고 별짓을 다하다가
어댑터부분을 자세히 보니
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View layout = convertView;
layout = inflater.inflate(R.layout.maincontents, null);
이렇게 되어있었습니다.
위와 같은 문장을
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View layout = convertView;
if(convertView == null){
layout = inflater.inflate(R.layout.maincontents, null);
}
이렇게 바꾸었더니..
누수가 나지 않게 되었습니다.
뷰가 null이 아니면 재사용하겠다는건데..
그런데 제가 위에 했던 방법에서는 왜 누수가 생겼는지 궁금합니다.
물론 속도는 느려진다고 알고는 잇었는데 누수까지 발생할 이유가 되나요?
제 논리로 생각할때는..
뷰를 재사용하지 않고 다시 inflater해서 중복 전개 한다고 해도,
처음 뷰가 생성되고 layout이라는 참조변수가 뷰 객체를 가르키고
두번째 뷰 전개시에는 다시 layout이라는 새로운 참조변수가 다른애를 가르키기때문에
첫번째 생성 했을때의 뷰객체는 중간에 붕뜨기때문에 가비지컬렉터의 대상이 되지 않나요?
제 논리로는 도저히 이해가 안됩니다.
도와주세요 선배님들