2012-01-05 3 views
1

나는 웹 서비스에서 데이터를 끌어와 ListView에 표시하는 조각이 있습니다. 행 배경에 사용할 수있는 10 개의 다른 선택기가 있습니다. 배경이 반복되면 배경이 반복됩니다.안드로이드 ListView 행 배경 OutOfMemory 문제가 발생

내가 직면 한 문제는 기기 (Galaxy Nexus!)가 이러한 배경을 모두 표시 할 수 없다는 것입니다. setbackgroundResource를 통해 백그라운드를 설정할 때 OS는 메모리를 확보하기 위해 GC를 계속 호출하므로 ListView 스크롤이 극도로 고르지 않게됩니다.

그래서 대신 Drawables를 캐시하려고했습니다. 나는 개선을 보았지만, 디바이스는 얼마나 많은 Drawable이 캐쉬되는지 OutOfMemory exception bedcause를 던질 것이다. 얼마나 많은 캐쉬가 있는지를 보여주기 위해 각각의 드로어 블을 두 개 포함하는 10 개의 선택기와 첫 번째와 마지막 두 개의 드로어 블을 모두 포함해야합니다. 이것은 메모리에서 24 드로어 블입니다.

이제 내가 사용하고있는 이미지의 크기가 될 수 있다고 생각 했었습니다. 그리고 크기를 조정하고 비례하여 늘릴 필요가 있지만, 이것이 작동하는지 확실하지 않습니다.

제안 사항? 나는이 논스톱으로 일하는 데 며칠을 보냈으며 실행 가능한/가까운 해결책을 찾지 못했습니다.

감사

아담

답변

6

Mimminito,

문제는 당신이 안드로이드 플랫폼에서 재앙에게 많은 개발자를 설명하고 있습니다. 그 이유는 Google에서 View Drawables를 구현할 때 이전 Drawable을 보관해야한다는 올바른 가정을해야했기 때문입니다. 더 많은 플랫폼에서 점점 더 많은 응용 프로그램이 이러한 동작을 필요로하기 때문입니다.

궁극적으로 문제를 완화하는 데는 여러 가지 방법이 있지만 아무도 모든 해결책을 찾지 못합니다.

  1. 배경을 바꿀 때 원본 배경을 가져옵니다. 비트 맵 인 경우 recycle()입니다. Drawable 인 경우 참조를 null로 설정하고 setCallback을 통해 콜백을 제거합니다 (오리엔테이션을 변경하거나 활동을 전환 할 때 특히 중요합니다).

  2. 그래픽은 메모리를 많이 차지하는 리소스 중 하나입니다. 드로어 블 또는 비트 맵을 사용하는 경우 픽셀 당 4 바이트를 사용합니다. 그러나 이미지가 제대로 표시되도록 크기를 조정해야하는 경우 앱이 업 사이징인지 또는 크기 축소인지에 관계없이 실제로 사용됩니다. 고해상도로 그래픽을 만드는 것은 대단한 일이지만 모바일 장치의 경우 실제로 사용하려는 크기로 크기를 조정하려고합니다.

  3. 많은 그래픽을 사용하는 경우 볼 수있는 그래픽 만 사용하는 것이 좋습니다. 즉, 항목이 32 개이고 표시 할 수있는 항목이 3 개 뿐인 경우 표시 가능한 3 개 항목과 인접 항목 일 수 있습니다. 많은 표준화 된 컨트롤에 대해 Lazy Loading을 구현할 수 있습니다.

  4. .9.png 파일을 보는 것이 좋습니다. 이러한 기능은 그래픽 최적화에 적합합니다.

  5. 버튼에 텍스트가 있으면 그래픽 파일에 그릴 수 없습니다. Android에서 그래픽 파일에 텍스트를 배치하도록 허용합니다. 그것의 다르게 대우하고 기억 소비는 상당하게 감소된다.외관이 좋지 않을 수도 있지만 신뢰도가 높아집니다. (여기에있는 이유입니다.)

  6. 경우에 따라 그래픽이 압축 된 형식이 아닌 플랫 비트 맵인 경우가 있습니다. 이렇게하면 프로세서 및 메모리에 대한 부하는 줄어들지 만 파일 크기는 줄어 듭니다. 어쨌든 압축 된 형식은 메모리에서 압축을 풀어 사용해야하지만 파일이 실제로 닫힐 때까지 메모리는 해제되지 않기 때문입니다. (이것은 압축을 푸는 데 사용 된 런타임 코드에 대한 메모리를 포함하지 않으며, 그래픽의 크기를 조정해야 할 때 더 많은 비용이 소요됩니다.)

  7. 일부 추가 System.gc() 문을 사용하면로드를 쉽게 할 수 있지만 가장 빠른 시일 내에 가비지 수집 준비가되었음을 시스템에 알려주기 때문에 신뢰할 수 없습니다.

  8. 마지막으로 장치의 해상도에 따라 여러 크기를 가질 수 있습니다. 이것은 앱을 통해 전송할 수있는 정보입니다. 이것이 로컬 애플리케이션에서 여러 장치 지원을 수행해야하는 방법입니다.

이러한 모든 제안이 도움이 될 수 있지만 많은 정보가 있습니다. 바라건대, 당신의 필요에 맞는 솔루션을 구현하기에 충분했습니다. 이 도움이

희망, FuzzicalLogic

+0

감사합니다. 실제로 그 중 많은 정보가 도움이 될 수 있습니다. 첫 번째 생각은 이미지의 크기를 조정하여 밀도 당 배율을 조정하는 것입니다. 사용하는 원본이 상당히 큽니다. 나는 이것이 어떻게 도움이되는지를 알게 될 것이고, 다음으로 나는 그것들을 9 가지로 패치 할 가능성을 더 높일 것이다. 가장 큰 문제는 시스템이 모든 (모든 getList()에서 백그라운드 자원을 설정하여) 핸들링 할 때 ListView가 너무 많은 드로어 블을 한번에로드하려고 시도하기 때문에 너무 빠르게 고르지 않게됩니다. – Mimminito

0

(당신이 고정 된 배경 이미지가있는 경우) 어쩌면 당신은 투명하게 cacheColorHint을 설정하는 : android:cacheColorHint="#00000000". 나에게 그것은 GC를 여러 번 호출하기도했다.

나는 다음과 같은 속성을 설정하면 안드로이드의 목록보기 캐싱 및 부드러운 목록 스크롤을 비활성화 것을 발견합니다 (GC가 호출되지 않도록 수시로 더 이상) : 또한 u는 기본을 제거하려는 경우

android:scrollingCache="false" 
android:animationCache="false" 

선택 색상 사용 :

android:listSelector="#00000000" 
관련 문제