位图大小超过VM预算java.lang.OutOfMemoryError:位图大小超过VM预算

时间:2012-08-24 06:09:00

标签: android

我知道这个问题已在本论坛多次提出,但我仍然无法得到解决此问题的完美答案。

在我的应用程序中,我使用3种不同尺寸的相同图像:小,中,大。

当我多次使用此图像时,我收到了此错误。

08-24 11:08:55.994: E/ImageLoader(636): bitmap size exceeds VM budget
08-24 11:08:55.994: E/ImageLoader(636): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-24 11:08:55.994: E/ImageLoader(636):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
08-24 11:08:55.994: E/ImageLoader(636):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:75)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeWithOOMHandling(LoadAndDisplayImageTask.java:161)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:148)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:104)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:58)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-24 11:08:55.994: E/ImageLoader(636):     at java.lang.Thread.run(Thread.java:1096)

任何人都可以帮忙解决这个问题..我已经搜索了很多同样的问题,但我仍然没有得到这样的解决方案..

这就是为什么我必须在这上午四点写这个问题。

我在等待肯定的回复..

感谢。

5 个答案:

答案 0 :(得分:1)

这是图像的常见问题。 Android为每个应用程序提供了一定的空间。在没有缩小尺寸的情况下拍摄的图像往往会导致此问题。

是最好的解决方案

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 8;(此处使用值作为2的幂,以获得最佳解决方案)

并在解码时将它们传递给位图

Bitmap bm = BitmapFactory.decodeStream(<input image file>, null, options);

答案 1 :(得分:0)

我认为您可以使用失败重试机制来解决此问题。

喜欢:尝试正常加载图像,如果失败,从catch块,尝试使用BitmapConfig(Bitmap.Config.ARGB_4444)以降低的质量加载它,如果再次失败,尝试以更低的质量加载它(Bitmap.Config.ALPHA_8)。我也有同样的问题,现在这个方法对我有用。

Bitmap imageBitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false; 
options.inPurgeable = true;
options.inInputShareable = true; 
options.inTempStorage = new byte[32 * 1024];
options.inPreferredConfig = config;//Bitmap.Config.ARGB_4444 or Bitmap.Config.ALPHA_8 when failed  
options.inSampleSize = 1;
imageBitmap = BitmapFactory.decodeFile(bitmapPath, options);

答案 2 :(得分:0)

您可以使用此方法解码位图:

public static Bitmap loadBitmap() {
    FileInputStream fis = null;
    Bitmap bitmap = null;

    BitmapFactory.Options option = new BitmapFactory.Options();
    option.inDither = false;
    option.inPurgeable = true;
    option.inInputShareable = true;
    option.inTempStorage = new byte[32 * 1024];
    option.inPreferredConfig = Bitmap.Config.RGB_565;

    try {
        fis = IOHelper.openInputStream(); //get the picture's FileInputStream
        FileDescriptor fd = fis.getFD();
        bitmap = BitmapFactory.decodeFileDescriptor(fd, null, option);
    } catch (IOException e) {

    } finally {
        IOHelper.closeQuietly(fis);
    }
    return bitmap;
}

答案 3 :(得分:0)

Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

这意味着设备已经内存不足并且正在强制关闭。

现在,既然你说多次使用图像时会出现错误,我相信你并没有释放资源。位图有时会占用大量空间,如果你将它们保存在内存中,如果设备进入OOM,我不会感到惊讶。不同的设备对内存有不同的规格,经过几次运行后就会填满内存。

因此,我的建议是清除您用于临时目的的位图和其他存储。

如果仍然无法解决问题,请将代码发布到处理图像的位置,我们将尝试查看是否有更高效的内存方式。

祝你好运!

答案 4 :(得分:0)

这是一个老问题,但我最终浪费了一整天的时间来尝试使用优秀的UIL修复旧设备上的图像内存问题。这些答案都没有特定于UIL,我的解决方案终于来自Nostra自己回答的这个问题的绊脚石:

How can I resize a picture before displaying it in a view with Android Universal Image Loader?

这里的 maxImageWidthForMemoryCache 和身高值非常重要。我正在下载并显示大约与屏幕大小相同的图像,并将其放置在图像视图中,屏幕的宽度和高度因此实际上没有任何缩放。这对于我的2.3手机而言太大了,并且将尺寸缩小了一半,因此几乎没有明显的图像质量下降。