2012-05-03 3 views
2

내 활동에 listview가 있고 다른 모든 것들은 제외하고 웹에서 이미지를로드하고 listview에 표시합니다. 2 가지 HTC 욕구, LG P-350, 1 대 이상의 전화 및 태블릿, 5 가지 안드로이드 장치에 대한 액세스 권한이 있습니다. 일반적으로, 모든 것이 잘 작동하지만 HTC의 욕망 중 하나에서 시작되는 응용 프로그램은 (난 그렇게 생각) 메모리 부족 오류로 인해 NullPointerException이와 충돌하는 경향이 출력입니다 : 나중에메모리 부족 오류 : 방대한 비트 맵

05-03 14:41:23.818: E/dalvikvm(843): Out of memory: Heap Size=7367KB, Allocated=4991KB, Bitmap Size=16979KB 

, logcat은 내 정적 변수 중 하나가 갑자기 null이되는 nullpointerexception의 스택 추적을 출력합니다. 변수는 앱의 루트 활동에서 초기화되고 앱에서 사용되고 코드에서 제외되지 않습니다. 메모리 부족으로 인해 시스템에 의해 무효화됩니다. 필자가 바라지 않는 한, 시스템은 17MB 크기의 비트 맵을 할당하려고 시도합니다.로드 된 이미지는 그리 크지 않을 것입니다. 그들은 100 * 70 jpeg이며, 그 중 어떤 것도 1MB보다 훨씬 적습니다. 내가 이해하지 못하는 또 다른 한 가지는 왜 한 장치에서만이 오류가 발생하는지입니다. 다른 장치는 정상적으로 작동합니다.

내 마음에, 이것은 매우 이상하게 보입니다. 단서를 찾을 수 없으므로 조언이 필요합니다.

+0

1 이미지 크기가 1MB 미만이므로 모든 이미지 크기를 추가하면 OutOfMemoryError를 제공 할만큼 충분히 커집니다. – Dharmendra

+0

Btw : 변수가 null 인 시스템이 없습니다. 당신의 코드가'null'을 넣었거나 변수가 아직 초기화되지 않았습니다. 그 일이 일어날 수있는 유일한 변수는 명시 적으로 만들어지는 것 : 약한/부드러운 참조. – zapl

+0

내 목록보기는 항목 클릭이 새로운 활동을 시작하는 방식으로 구성됩니다 (활동 B로 함). 나는 listview의 onItemClick에서 중단 점을 설정하고, 디버그 모드에서 app을 실행하고, listview 활동을 입력하고, listview 항목을 누르고, 중단 점에서 중지하고, 정적 변수의 값을 검사합니다. 이는 null이 아닙니다. 그런 다음 B의 onCreate에 중단 점을 배치하고 거기에서 멈추고 동일한 정적 변수의 값을 검사합니다. 이미 null입니다. 마술인가? 나는 listview 항목 클릭 리스너와 B의 oncreate 사이에 내 코드가 없습니다. 변수가이 두 점 사이 어딘가에 있습니다 ... –

답변

2

이유는 간단합니다. 메모리가 말하자면 JPG 데이터를 보유하고 있지는 않지만 압축이 풀린 등가물입니다. 물론 말할 것도없이 원본 파일보다 많은 RAM 공간이 필요합니다.이 17MB limit는로드 된 모든 비트 맵을 한 번에 하나의 비트 맵으로 제한하는 것이 아닙니다.

내 프로그램 (Mapquest Android API MapView 개체의 맞춤형 타일 로더) 중 하나에서 유사한 문제를 해결해야했지만 가능한 한 수동으로 내 비트 맵을 recycle() 메서드로 호출해야했습니다. System.gc()을 사용하여 전략적 위치에의 수집에 시스템을 ... 강요

최고의 뉴스의 무기명하지 죄송

...

당신은 내가했던 것과 같은 전략을 사용하여 문제를 해결할 수

: 기본적으로 I 로드 된 비트 맵을 내 외부 SD 카드와 같은 하드 저장소에 캐싱하고 RAM에 모든 것을 보관하지 않고 필요한 경우 즉시 다시로드하십시오.

+0

크래시가 큰 비트 맵 크기로 인해 발생한 경우 어떻게 다른 장치에서 모든 문제가 해결 될 수 있습니까? 그 중 하나가 또 다른 HTC 욕망입니까? –

+0

모든 Android 기기에 대해 표준 최대 RAM 풋 프린트 크기가 고정되어 있지 않다고 생각합니다. 예를 들어 Android 2.1을 실행하는 HTC Desire의 대략 최대 17mb 크기의 풋 프린트가 있었지만 Acer Iconia 태블릿은 충돌하는 데 더 많은 리소스가 필요했습니다. 누구나 공식 문서를 통해이를 확인할 수 있습니까? 참고 : 정확히 동일한 OS 버전에서 실행중인 2nd Desire 장치입니까? – epichorns

+0

이것은 커널 한계입니다 (예 : dalvik.vm.heapgrowthlimit). 이는 build.prop에서 변경할 수 있습니다. 오래된 장치 (또는 메모리가 적은 장치)에서는 16 또는 24Mb로 설정되었습니다.최근 장치에서는 64Mb로 설정됩니다. – 3c71