2011-11-10 2 views
1

저는 Android 애플리케이션에서 발생할 수있는 메모리 누수를 추적 해왔고, 무엇을해야할지 모르겠습니다. 먼저, 내가하려고하는 것을 설명 할 것입니다.Gallery 내부의 ListView로 안드로이드 메모리 누수가 발생했습니다.

나는 Eclair (2.1, API 레벨 7) 및 HTC Incredible 실행 진저 브레드 (2.3.7, API 레벨 10)에서 테스트하고 있습니다. LogCat을 관찰 한 결과 응용 프로그램의 최대 힙 크기는 약 32MB라고 가정합니다.

연락처가 여러 개인 주소록을 만들려고합니다. 왼쪽과 오른쪽으로 스크롤하여 페이지 간을 이동하고 스크롤을 위아래로 스크롤하여 현재 페이지를 탐색합니다. 이를 수행하기 위해 나는 Gallery 어댑터를 사용하여 연락처 목록을 ListView으로 변경합니다.이 어댑터의 어댑터는 하나의 연락처를 RelativeLayout으로 변경합니다.

모든 것이 정상적으로 작동하는 것 같지만 기본 (외부) 메모리가 부족합니다. 갤러리를 스 와이프하면 빨리이 표시됩니다. 나는 Gallery 주위를 한동안 스왑 한 후 HPROF 덤프를 만들어 MAT로 가져 왔습니다. 히스토그램에서, 나는 내 연락처 ListView에 의해 전적으로 개최되었다 내 연락처 RelativeLayout의 몇 백을 찾았습니다. 여기에 내가 그 ListView의 [절단] 매트 merge_shortest_paths 출력에서 ​​보았을 때 내가 무엇을 발견 :

android.view.ViewRoot$1 
+ this$0 android.view.ViewRoot 
    + mAttachInfo android.view.View$AttachInfo 
    + mScrollContainers java.util.ArrayList 
     + array java.lang.Object[303] 
     + [110], [112], [114], [116], [118], ... com.example.LeakyListView 
     + ...and so forth. 

그 유출 ListView의 잡고있는 유일한 방법이 android.view.View$AttachInfomScrollContainers 필드

했다. 문제는 처음부터 어떻게 내 견해가 들어가는 지 모르겠다. 그래서 나는이 누설을 막는 방법을 놓치고있다.

이 메모리 누수는 어떻게 해결합니까? 또는 적어도이 참조 사슬은 어떻게 만들어졌으며 ViewRoot, AttachInfomScrollContainers은 무엇입니까?

간단한 테스트 케이스로 분리하여 여기에 곧 게시 할 예정이지만, 대화를 시작하기에 충분할 것으로 기대하고 있습니다.

+0

는 u는 나에게 당신이 사용하고있는 이미지의 최대 크기를 알 수 있습니까? –

+0

각 연락처 이미지는 32x32입니다. 샘플 데이터의 경우 각 "페이지"에는 10 개의 연락처가 있으며 7 개의 페이지가 있습니다. 나는 [Fedor의 lazylist] (https://github.com/thest1/LazyList)와 비슷한 ImageLoader를 사용하고 있으며 소스 이미지는 각각 약 37x37입니다. –

+0

이제 정확히 똑같은 문제가 있습니다. –

답변

3

당신은 정말, 정말 이런 종류의 일을 대신 갤러리의 ViewPager를 사용한다 : http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html

+0

나는'ViewPager'에게 총을 줄 것입니다. 이것이 바로이 기능을 구현하기 시작할 때 내가 찾고 있었던 것입니다. 이런 방식으로'Gallery'와'ListView'를 사용할 때이 누수가 내재적으로 문제가되는 이유를 설명 할 수 있습니까? –

+0

나는'ViewPager'를 사용하여 전환했고 누수는 모두 사라졌지 만 사라졌습니다. 다른 페이지에서 정말 빠르게 스 와이프 할 때 여전히 몇 가지 문제가 발생합니다. 그러나 이것이 'ViewPager'의 오류가 아니라 이미지를로드하는 방식의 문제라고 생각됩니다. 헤즈 업에 감사드립니다! 어쨌든'갤러리 '는 해킹처럼 느껴졌습니다. –

+0

Gallery는 ListView와 같은 스크롤 가능한 것들을 보관하기위한 것이 아닙니다. – hackbod

관련 문제