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를 호출하는 것은 좋은 생각입니다.
출처
https://stackoverflow.com/questions/22008832