OutOfMemoryError:位图大小超过VM预算: – Android

OutOfMemoryError: bitmap size exceeds VM budget :- Android

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Android: Strange out of memory issue while loading an image to a Bitmap object

我正在从Url下载图像并显示它们。 在下载时它给出out of memory error : bitmap size exceeds VM budget。 我正在使用drawable。 代码如下:

1
2
3
4
5
6
7
8
9
10
11
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)

1
2
3
4
5
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()。


我尝试过很多可行的东西。

1
2
3
4
5
6
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();


事实是,在某些Android版本上存在BUG,特别是版本2.1始终出现类似这样的问题。

我发布了一个应用程序,其中我非常注意资源使用。我甚至删除了很多我正在使用的位图,现在它们是使用图形基元动态创建的。我还在没有使用时回收位图。当然,我已经检查过我的应用程序中没有内存泄漏:使用的内存不会在没有控制的情况下增长,它会将所有时间保持在合理的值内。

虽然我已经投入了大量精力来避免这个问题,但我仍然会遇到许多令人烦恼的例外情况,例如2.1和2.1-update1设备。我现在正在使用命令来报告崩溃,我已经看到它甚至在应用程序仅使用4兆字节的RAM时出现,比每个Android设备必须拥有的16M的堆大小小4倍 - 事实上这些天大多数设备的堆大小都超过16M-。

我所有的位图都有800x480像素的大小,在最坏的情况下,因为ARGB_8888每个可能不会占用超过1.5MB,但是当占用4兆字节时它会崩溃尝试加载一个,所以应该至少有另外12 MB自由。我的大部分位图都是作为占用内存一半的ARGB_4444加载的,当位图看起来非常差4444时我只使用ARGB_8888。

所以对我来说很明显,这些Android版本上有些东西不能正常工作。 99'9%的崩溃来自2.1和2.1更新,其余可能由其他准时原因解释。


这是一个实用的答案,我试图在运行时避免这个问题。它也解决了我的问题。

1
Runtime.getRuntime().gc();

调用垃圾收集器是个好主意。