2013-06-24 4 views
1

각 레이어를 켜고 끌 수있는 대화 형지도를 만들기 위해 서로 위에 20 개 이상의 이미지를로드해야합니다.LayerDrawable OutOfMemoryError

나는 이것을 위해 LayerDrawable을 사용하기로 결정했지만 OutOfMemoryError가 계속 나타납니다. Large Heap을 true로 설정 한 후에도 약 8 개의 이미지를로드 할 수 있지만 그 이상이라면 여전히 오류가 발생합니다.

오류가 발생하지 않고 LayerDrawable에 많은 이미지를로드 할 수있는 방법이 있습니까? 아니면 더 좋은 방법이 있습니까?

+1

이미지의 크기는 얼마입니까? – Luksprog

+0

@Luksprog 가장 작은 것은 5.66kb이고 가장 큰 것은 2.74mb입니다. – ZhaoYiLi

+1

메모리가 없어서 메모리에있는 모든 이미지를로드 할 수 없습니다. 나는 요구에 따라 이미지를로드하는 사용자 정의 뷰를 만들 것입니다 (모든 뷰가 보이지 않는다고 가정 할 경우). 또한 http://developer.android.com/training/displaying-bitmaps/index.html을보십시오 – Luksprog

답변

1

Luksprog의 링크 덕분에 문제를 해결할 수있었습니다.

Drawable[]에 이미지를 추가하기 전에 각 이미지의 더 작은 버전을로드하려면 inSampleSize을 사용했습니다. 이렇게하면 많은 메모리 사용량이 줄어 듭니다.

0

그런가요?

Resources r = getResources(); 
Drawable[] layers = new Drawable[20]; 
layers[0] = r.getDrawable(R.drawable.01); 
layers[1] = r.getDrawable(R.drawable.02); 
etc[...] 
LayerDrawable layerDrawable = new LayerDrawable(layers); 
testimage.setImageDrawable(layerDrawable); 
+0

나는 그것을 시도했지만 배열에 이미지를 추가하기 시작할 때 오류가 발생합니다. – ZhaoYiLi

+3

이 코드는 어떻게 메모리 부족 문제를 해결할 수 있습니까? – lelloman

+0

나는 그의 배열이 올바르게 초기화되지 않았다는 것을 모른다. 만약 당신이 답을 주었다면. – marshallino16

0

큰 힙 플래그를 사용하면 벌집 이상의 경우에만 작동하며 가져올 메모리 용량에 대해서는 약속하지 않습니다. 이전과 같은 금액을 얻을 수 있습니다.

고품질의 많은 이미지를로드하려면 화면의 최대 크기로 축소하거나 자바가 아닌 솔루션 (예 : openGL/andengine/lbgdx)을 사용하십시오.

Java 솔루션을 선택하는 경우 앱의 최소 장치 힙 크기는 16MB임을 알아야합니다. 나는 그것이 일종의 안드로이드 API로 시작하는 것이 더 큰 것이 좋겠지 만, 이것은 당신이 추측 할 수있는 어떤 것이 아니다. (나는 아직 그러한 한계를 가진 새로운 장치를 보지 못했지만).

일반적으로 앱에는 전체 화면이있는 비트 맵을 저장할 수있는 충분한 메모리가 있다고 가정 할 수 있습니다. 당신은 심지어 그것이 항상 이것보다 두 배가 있다고 가정 할지도 모르지만 그것은 그것입니다.

네이티브 다른 솔루션을 선택하는 경우 장치 RAM 메모리로만 제한되지만 메모리를 해제하기 위해서는 사용자가 직접 설정해야합니다.

어떤 솔루션을 선택하더라도 장치의 메모리 양은 여전히 ​​제한되어 있습니다.