2012-04-25 4 views
0

메모리를 해제하는 데 문제가 있습니다. HashmapBitmap을 추가했으며 비트 맵의 ​​수가 꽤 큽니다. 이러한 이유로 저는 OutOfMemoryError을 얻고 있습니다. 그래서 이것을 위해 적어도 Collection에서 사용되는 Bitmap을 해제하기로 결정했습니다. 메모리 부족이나 시스템의 힙 메모리가 부족합니다.메모리 관리 논리의 사용 가능한 총 메모리

현재 메모리를 사용할 수 있도록 "ActivityManager.MemoryInfo.availMem"을 사용했지만 총 RAM 크기의 메모리를 사용할 수 있으며 힙 메모리는 제공하지 않습니다. 그리고이 메모리가 업데이트에서 비트 맵을 릴리스 할 때 업데이트되지 않는 것으로 나타났습니다.

그런 다음 나는이 세 가지 방법을 사용하고 있습니다 :

Debug.getNativeHeapAllocatedSize() 
Debug.getNativeHeapFreeSize() 
Debug.getNativeHeapSize() 

하지만 난 NativeHeapSize 일부 일정 수준까지 증가에 간다 발견, OutOfMemoryError이 발생한다는 후 변경, 16  메가바이트을 말한다. 이 또한 NativeHeapAllocatedSizegetNativeHeapSizeBitmapCollection에서 릴리스 할 때 감소하지 않는 것으로 나타났습니다.

어떻게이 문제를 해결할 수 있습니까?

내 문제는 현재 사용 가능한 메모리가 임계 값 메모리를 초과하면 컬렉션에서 Bitmap을 해제하고 garbage collection은 메모리를 회수하고 무료로 사용할 수 있도록 사용 가능한 최대 응용 프로그램 메모리와 현재 사용 가능한 메모리를 계산하려고합니다. 오류가 발생하지 않습니다.

+1

http://developer.android.com/training/displaying-bitmaps/index.html – Michaeldcooney

답변

0

메모리에 Bitmaps을 저장하는 것은 매우 비쌉니다. 이미지 형식에 따라 각 픽셀은 최대 4 바이트의 메모리를 소비 할 수 있습니다.

전체 CollectionBitmaps으로 동시에 표시하고 있습니까? 그렇지 않다면 상점 이 아닌은 비공개 Bitmaps을 저장하고 이미지에는 URI을 저장하고 필요할 때 즉시로드 할 것을 제안합니다.

전체 컬렉션을 표시하는 경우 비트 맵을 적절한 크기로 다운 샘플링하여 렌더링되지 않는 픽셀을 저장하지 않도록하십시오.

+0

예 이러한 비트 맵을 자주 사용하지만 전체가 아닌, 사용자가 사용하는 경우 총 사용량 지속적으로 애플 리케이션에서 탐색 후 대부분 비트 맵을 사용하고, 이러한 비트 맵은 서버에서로드되며, 내가 비트 맵 사용자가 이러한 이미지를 다시로드 할 때까지 기다려야 할 것입니다. 그래서 다른 방법이 있나, 아니면 잘못된 길로 들어가서 나를 도와주세요. –

+0

이미지를 로컬 파일에 저장해야 서버에서 한 번만로드 할 수 있습니다. 로컬 파일에서 이미지로드 및 표시는 매우 빠릅니다! – slayton

+0

네 제안대로 하겠지만 앱에 ActualMemoryAvailable 및 TotalMemoryAvailabe가 있습니까? –