2010-07-23 5 views
0

모든 홈 화면마다 다른 배경 화면을 설정하려고하지만 OutOfMemory 문제가 발생합니다. 나는 디스플레이 폭의 5 배인 배경 화면 비트 맵에 오버레이하려고하는 5 비트 맵을 가지고 있습니다. 아래 코드를 사용하여 OOM을 얻습니다. 문제는 큰 벽지 비트 맵을 만드는 코드의 첫 번째 줄인 것 같습니다. 내 질문은이를 수행 할 수있는 방법이 있는지 (즉, 더 적은 메모리를 사용하는 방법 또는 더 많은 메모리를 할당하는 방법) 여부입니다. 감사!안드로이드 - 모든 홈 화면을위한 다른 비트 맵 벽지 - OutOfMemory

Bitmap wallpaper = Bitmap.createBitmap(displayWidth*5,displayHeight, Config.ARGB_8888); 
Canvas canvas = new Canvas(wallpaper); 
Uri data = getIntent().getData(); 
Bitmap bmp = getBitmap(data, imagePosition, displayWidth, displayHeight); 
canvas.drawBitmap(bmp, 0, 0,null); 
WallpaperManager wallpaperManager = (WallpaperManager) SetterActivity.this.getSystemService(Context.WALLPAPER_SERVICE); 
wallpaperManager.setBitmap(wallpaper); 
wallpaperManager.suggestDesiredDimensions(bmp.getWidth()*2, bmp.getHeight()); 
+0

비트 맵의 ​​크기는 얼마입니까? – Sephy

+0

글자 크기 480x800의 Nexus One을 테스트 중입니다. 먼저 5 배 (2400x800) 여야하는 배경 화면 비트 맵을 만듭니다. 그런 다음 모든 홈 화면에서 크기 480x800 크기의 캔버스에 다른 비트 맵을 그립니다. – timothyjc

+0

displayWidth 및 displayHeight의 값은 무엇입니까? 그것들은 본질적인 너비와 높이입니까? (myBitmap.getIntrinsicWidth(), myBitmap.getIntrinsicHeight();) – Jorgesys

답변

0

한 번에로드 된 이미지의 5 화면의 가치를 가지고 주위를 얻을 수없는 경우에, 당신은 한 번에 하나만로드 한 시도하고 현재보고되고있는 홈 화면을 기반으로 전환 할 수 있습니다.

즉, 메모리에 2 비트 맵이 있고, 하나는 current이고 다른 하나는 next입니다. 첫 번째보기에서 current 비트 맵을로드하십시오. onOffsetsChanged을 사용하여 스크롤이 발생하는 시점을 결정하고 그 시점에서 다음 홈 화면을 기반으로 비트 맵 next을로드합니다. 당신은 당신 자신의 스크린 A에서 B로 그 보간법을 할 필요가있을 것입니다. 스크롤이 완료되면 current을 재활용하고 nextcurrent으로 저장하십시오.

저는이 구현에서 지금 당장 생각하지 못하는 몇 가지 문제점이있을 것이라고 확신합니다.하지만이 방법으로는 2 비트 맵만 할당 할 수 있습니다. 행운을 빕니다!

0

비트 맵 데이터는 기본 힙에 할당됩니다 (자세한 내용은 BitmapFactory OOM driving me nuts 참조). 사용 가능한 양은 플랫폼에 따라 다릅니다 (예 : API 레벨 2.2에는 24M 기본 힙이 있음). 그러나 그 이상으로 확장 할 방법은 없습니다. 그리고 얼마나 많은 네이티브 힙 공간이 당신과 다른 어플리케이션이 비트 맵/그래픽으로 무엇을하고 있는지에 달려 있습니다.

코드/배경 무늬 비트 맵의 ​​첫 번째 줄은 480 * 800 * 32/8 = 1.536MB로, 최대 값 내에 있습니다. 따라서 힙의 상당 부분이 이미 그 라인에 도달 할 때 이미 할당 된 것 같습니다.

네이티브 힙은 가비지 수집되지만 드물게 - 응용 프로그램이 명시 적으로 해제하지 않으면 데이터가 복구되지 않습니다. 따라서 비트 맵을 재활용하지 않고 응용 프로그램을 실행하는 경우 (onDestroy에서) 몇 번의 실행 후 원시 힙을 잘 먹을 수 있습니다.

관련 문제