2011-04-01 4 views
7

내 앱 사용자는 이미지 및 프로그램을 선택하여 사용자가 이미지를 변경할 수 있습니다. 거기에 다른 안드로이드 장치가 많이 있기 때문에 내 프로그램이 힙 크기가 작은 장치 중 일부에서 충돌합니다. VM 예산 때문에 충돌하지 않도록 사용자의 휴대 전화에 가장 적합한 크기를 계산하고 싶습니다. "Picsay Pro"에서 스크린 샷을 추가하여 정확하게 찾고 있습니다. "BitmapFactory.Options"에 대한 내 유일한 문제는 VM 예산으로 인해 응용 프로그램을 충돌시키지 않는 이미지 크기를 결정하는 방법을 찾는 것입니다.VM 예산을 초과하지 않는 최적의 이미지 크기를 선택하는 방법은 무엇입니까?

enter image description here

답변

12

을 도울 수 있다고 생각() .maxMemory() - Total Heap Limit 크기 (바이트)를 반환합니다.

Debug.getNativeHeapAllocatedSize() - 응용 프로그램에서 이미 사용하고있는 데이터의 양 (바이트)을 반환합니다.

이 공식으로 사용하고있는 비트 맵의 ​​크기를 계산은 long Bytes_allocated = (height of the Image) * (width of the Image) * 4;

는 응용 프로그램의 appropiate 크기를 선택하는 freeMemoryBytes_allocated 비교.

1

사실은 두 가지 이유로 전화 이미지를 압축 끝났다. 하나는 업로드 속도이고 다른 하나는 힙 문제입니다. 비슷한 일을 시도하거나 최소한 스택 추적을 게시 할 수 있습니다!

long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());

,

Runtime.getRuntime :

0

지금까지 이미지 크기와 사용 가능한 메모리를 다루는 신뢰할만한 방법을 찾지 못했습니다. 문제는 메모리가 매우 빨리 조각화되어 10MB의 여유 공간을 가질 수 있지만 2MB 이미지의 연속 공간이 없기 때문입니다. 실제로 필요한 것은 가장 큰 여유 공간의 크기이지만이 방법을 찾는 방법은 없습니다. 메모리를 조각 모음하는 방법이 더 좋을 수도 있지만, 이와 같은 기능은 없습니다.

그래도 사용 가능한 메모리가 이미지보다 작 으면 사용하려고하면 충돌이 발생할 수 있으므로 적어도 사용하기 전에 확인하는 것이 좋습니다.

2012 년 말 태블릿의 해상도가 1920x1280 인 지금은 하나의 배경 이미지에 20MB의 연속 메모리가 필요합니다! 이 태블릿 중 일부는 이제 256MB까지 힙을 허용하지만 더 많은 VM 공간을 버리고 겉으로는 해결할 수 있지만 실제로는 메모리 조각 모음 또는 공간 확보 방법이 필요합니다.

이미지 크기를 조정하거나 수정하지 않고 변경된 각 이미지의 크기가 같고 앱을 Android 3으로 제한하는 데 도움이되는 트릭이 하나 있습니다.0+ :

Options opt2 = new BitmapFactory.Options(); 
opt2.inBitmap = mBitmap;  // reuse mBitmap to reduce out of memory errors 
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2); 

이렇게하면 이미지의 메모리 영역 m 비트 맵이 다시 사용됩니다.

관련 문제