2014-11-24 5 views
1

내 응용 프로그램 기본 화면이 몇 개로드 된 후 OutOfMemoryError 예외가 발생합니다. 앱이 위치에 대한 데이터와 배경 이미지를로드합니다. 선택할 수있는 몇 가지 옵션이 있으며 5-6 개의 다른 위치 선택 후 힙이 192MB를 초과하고 오류가 발생합니다. 나는 문제가 내 비트 맵을 제대로 사용하지 못한다고 생각한다.OutOfMemoryError - 비트 맵으로 힙 크기 깨기

내 코드는 꽤 길고 명확하지 않으므로 예제를 드리겠습니다. 누군가가 나를 도울 수 있습니다. 이미지 메모리 관리와 관련된 기본 사항을 파악하지 못했습니다 (문서를 읽고 광범위하게 검색했으며, 나는 이것에 대해 누군가와 대화하는 것이 이상적이다.)


5 가지 조건의 if가 있는데, 각각 다른 이미지를 반환합니다. 이미지를 비트 맵으로 변환하고 기본 레이아웃의 새로운 드로어 블 소스로 설정합니다.

그런 다음 동일한 기능을 사용하지만 다른 위치에서 다른 이미지를 사용합니다.

이 작업을 몇 번 수행하면로드되는 모든 이미지가 메모리에 남아있어 막히면 오류가 발생합니다. 매우 간단하게 유지하려고 할 때이 여러 가지 이미지를 내 레이아웃 배경에로드하는 것과이 문제를 방지하기 위해 구현해야하는 단계는 무엇입니까?

+0

192메가바이트 당신이 전화를 많이 얻을 것보다 훨씬 크다. 일반적으로 ~ 32MB로 내려 가고 싶어합니다. 다행히도 이러한 장치는 일반적으로 화면의 밀도가 낮기 때문에 많은 픽셀을 화면에 표시 할 필요가 없습니다. 이것은 비트 맵을 처리하는 데 유용한 리소스입니다. http://developer.android.com/training/displaying-bitmaps/index.html – asdasd

답변

1

더 이상 사용하지 않는 비트 맵을 재활용해야합니다. 매우 제한된 수의 Bitmap 인스턴스를 동시에 보유하고 있는지 그리고 비트 맵 호출을 사용하여 마무리 할 때마다 "recycle()"메소드를 보유해야합니다.

여기에서 자세한 정보를 찾을 수 있습니다 : Managing Bitmap Memory & Caching Bitmaps

+0

더 이상 비트 맵에 대한 참조가 없을 때 dalvik이 처리해야합니까? – jvrodrigues

+0

하지만 언제 재활용해야합니까? 그리고 재활용이 더 이상 필요하지 않다는 것은 사실입니다. 나는 그들 모두를 null로 설정하려고 시도했다. 일시 중지시 GC를 수동으로 호출하고 활동을 다시 시작했지만 실제 변경은 없다. –

+0

@Twentyonehundred 위의 링크에있는 정보에 따르면 Android 2.3.3 (포함)까지 명시적인 재 호출이 필요했지만 이후 버전에는 필요하지 않습니다. 가비지 수집 알고리즘을 향상시킬 수 있습니다. 재활용 타이밍에 관해서는 가능한 한 빨리 리사이클을 호출하는 것이 좋습니다. 비트 맵 인스턴스를 사용하지 않을 경우입니다. 비트 맵 캐싱에 대한 유용한 정보는 여기를 참조하십시오. http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html –