OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다 :-Android
Url에서 이미지를 다운로드하여 표시하고 있습니다. 다운로드 할 때 out of memory error : bitmap size exceeds VM budget. 드로어 블을 사용하고 있습니다. 코드는 다음과 같습니다.
HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap = Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();
다음은 오류입니다. 05-28 14:55:47.251: ERROR/AndroidRuntime(4188): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
decodeStream(is, outPadding, opts)함께 사용
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024];
이미지 크기를 확인한 다음 적절한 요소로 다운 샘플링 할 수 있습니다.
이 질문을 참조하십시오 : 큰 비트 맵 처리
이 문제는 여러 번보고 된 것 같습니다. 예를 들어 여기 와 여기 에 ... 죄송합니다 Shalini하지만 같은 문제라면 전혀 해결책이없는 것 같습니다 ...
Romain Guy의 유일한 조언은 메모리를 적게 사용하는 것입니다 ...
그래서, 당신의 물건을 다르게 생각하면 행운을 빕니다 ...
마지막으로 위에서 제안한대로 이미지를 리샘플링 한 후 bitmap_file.recycle ()을 호출 할 수 있습니다 .
사실은 일부 Android 버전에 버그가 있다는 것입니다. 특히 버전 2.1은 이와 같은 문제로 항상 실패합니다.
리소스 사용에 많은 신경을 쓴 앱을 출시했습니다. 사용하던 비트 맵도 많이 삭제했는데 이제 그래픽 프리미티브를 사용하여 즉석에서 생성됩니다. 비트 맵을 사용하지 않을 때도 재활용합니다. 물론 내 앱에 메모리 누수가 없는지 확인했습니다. 사용 된 메모리는 제어 없이는 커지지 않으며 항상 합리적인 값 내에서 유지됩니다.
이 문제를 피하기 위해 많은 노력을 기울 였지만 2.1 및 2.1-update1 장치에서 이와 같은 성가신 예외가 계속 발생합니다. 현재 크래시를보고하기 위해 기준을 사용하고 있으며 앱이 모든 Android 기기가 앱에 가져야하는 16M 힙 크기보다 4 배 적은 4MB의 RAM 만 사용하는 경우에도 발생한다는 것을 확인했습니다. 요즘 대부분의 장치는 16M보다 큰 힙 크기를 가지고 있습니다.
내 모든 비트 맵의 크기는 800x480 픽셀입니다. 최악의 경우 ARGB_8888이 각각 1.5MB 이상을 차지하지 않을 수 있지만 4MB 만 차지하면로드하려고하면 충돌하므로 최소 12MB가 더 있어야합니다. 비어 있는. 그리고 대부분의 비트 맵은 메모리의 절반을 차지하는 ARGB_4444로로드됩니다. 비트 맵이 4444에서 정말 좋지 않을 때만 ARGB_8888을 사용합니다.
그래서 저에게는 이러한 Android 버전에서 제대로 작동하지 않는 것이 있다는 것이 매우 분명합니다. 이 충돌의 99'9 %는 2.1 및 2.1 업데이트에서 발생하며 나머지는 다른 정확한 이유에 의해 설명 될 수 있습니다.
나는 이것이 작동하는 많은 것을 시도했습니다.
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true;
opts.inScale=8;
///after you use your images
System.gc();
이것은 런타임 에서이 문제를 피하기 위해 시도한 실용적인 대답입니다. 그리고 그것은 또한 내 문제를 해결했습니다.
Runtime.getRuntime().gc();
Garbage Collector를 호출하는 것은 좋은 생각입니다.
참고 URL : https://stackoverflow.com/questions/2928002/outofmemoryerror-bitmap-size-exceeds-vm-budget-android
'Program Club' 카테고리의 다른 글
| Visual Basic 6에서 대 / 소문자 변경 중지 (0) | 2020.12.05 |
|---|---|
| C # WinForms 앱 트레이를 최소화하는 적절한 방법은 무엇입니까? (0) | 2020.12.05 |
| App Engine 스케줄러는 언제 새 스레드와 새 인스턴스를 사용하나요? (0) | 2020.12.05 |
| C ++에서 64 비트 정수에 대한 "표준"htonl과 유사한 함수가 있습니까? (0) | 2020.12.05 |
| 매우 간단하고 간결하며 쉬운 GUI 프로그래밍 "프레임 워크" (0) | 2020.12.05 |