1

각 섹션에 this guide을 사용하는 어댑터가 있고 각기 다른 어댑터가 있기 때문에 스크롤 할 때 반복해서 할당하고 다시 사용하지 않도록 섹션 된 목록보기를 구현했습니다 (그러나 뒤로 스크롤 할 때 재사용하지만 동일한 어댑터)와 그것의 getView 방법 것은)이 (간략화 같다 :Android ListView 메모리 누출?

 Map< String, ? > object = null; 
     String id = null, title = null, rating = null, pic_url = null; 
     object = sectionContent.get(position).getMap(); 
     id = (String) object.get(EventRowValues.ROW_ID); 
     title = (String) object.get(EventRowValues.ROW_TITLE); 
     pic_url = (String) object.get(EventRowValues.ROW_PIC_URL); 

     View hView = convertView; 
     if (hView == null) { 
      hView = mInflater.inflate(R.layout.popularity_row, null); 
      ViewHolder holder = new ViewHolder(); 
      holder.pic = (ImageView) hView.findViewById(R.id.icon); 
      holder.title = (TextView) hView.findViewById(R.id.label); 
      hView.setTag(holder); 
     } 

     final ViewHolder holder = (ViewHolder) hView.getTag(); 

     holder.id = id; 

     mImageWorker.loadImage(pic_url, holder.pic); 

     holder.title.setText(title); 

     return hView; 

loadImage 방법 this google example에서이다.

문제는 내가 스크롤 할 때 점점 더 많은 메모리가 필요하다는 것입니다. 예를 들어 5-10 행의 경우 2MB입니다. 다시 스크롤하면 더 이상 메모리를 차지하지 않지만, 메모리 양을 할당해서는 안된다는 것을 알기까지는 뷰를 재사용하기 때문에 뷰를 재사용하기 때문에 메모리가 필요할 때 메모리를 사용하고 스크롤하여 캐시와 동일한보기 및 비트 맵 (많은 드로어 블이 캐시에서 반환 된 동일한 객체이기 때문에).

무엇이 문제 일 수 있습니까? 똑똑한 재사용 가능한 섹션 된 listView를위한 다른 옵션은 무엇입니까?

고마워요.

+0

내 솔루션에 의해 문제가 해결 되었습니까? – Shrikant

답변

2

알아 냈어. 이전에 언급 한 가이드의 단면보기를 사용했는데 셀을 올바르게 재사용하지 않습니다. ExpandableListView를 구현하여 일부 패치를 적용하여 작동하도록 만들었으며 이제는 훌륭합니다.

감사합니다.

1

mImageWorker.loadImage (pic_url, holder.pic)를 주석 처리하십시오. 및 메모리 소비

+0

같은 소비입니다. 목록을 스크롤하는 데 7MB (30 개 항목). 아마도 할당 뷰 자체와 그것의 imageViews는이 소비를 담당 할 것이고 아마도 셀 셀이 할당되고 재사용되지 않을 것입니다.하지만 다시 스크롤하면 여전히 7MB입니다. –

+0

xml과이 뷰에 해당하는 코드에서 imageViews를 제거했습니다. 이제이 목록에 대해 3MB가 필요합니다 ... 여전히 너무 많습니다 ... –

+0

그리고 새로운 10 개의 행마다 최대 2MB가로드됩니다 ? – logcat

2

의 쇼 차이는이 시도 : UPDATE :

 ViewHolder holder = new ViewHolder(); 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      hView = mInflater.inflate(R.layout.popularity_row, null); 
      holder.pic = (ImageView) hView.findViewById(R.id.icon); 
      holder.title = (TextView) hView.findViewById(R.id.label); 
      hView.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

PS를 : 당신은 두 번 홀더 객체를 만들었습니다. 정말 필요한가요?

어떤 안드로이드 버전을 사용하고 있습니까? coz도 같은 문제가 있습니다. 버전 11을 사용하고 있습니다. 상위 버전에서는 목록을 빨리 스크롤 할 수있게하려면 android:hardwareAccelerated="true" 속성을 activity tag에 입력해야합니다. 매니페스트 파일.

+0

고맙지 만이 코드와이 코드의 차이점은 무엇입니까? 필요없는 경우에도 배당 자입니다. 그리고 API 레벨을 의미합니까? android : hardwareAccelerated는 무엇을합니까? 감사합니다 –

+0

내 업데이트 된 코드를 참조하십시오. 여기서는 하나의 홀더 객체 만 생성하고 이후의 호출에서이 객체를 사용합니다. 오브젝트에 값을 할당하는 것의 차이점이 있습니다. 여기서는 처음으로 객체 만 만들고 이후 호출을 위해 객체에 값을 할당했습니다. HardwareAcceleration은 다음을 참조하십시오. http://developer.android.com/guide/topics/graphics/hardware-accel.html – Shrikant

+0

감사합니다. 흥미로운 통찰력을 찾은 후 질문을 업데이트했습니다. –