OutOfMemoryError:位图大小超过虚拟机预算: – Android
可能重复:
Android:加载图像到Bitmap对象时出现内存不足的问题
我从Url下载图像并显示它们。 在下载的时候,它给出out of memory error : bitmap size exceeds VM budget
。 我正在使用drawable。 代码如下:
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,但如果这是同样的问题,似乎没有任何解决方案…
罗曼·盖伊唯一的建议是使用更少的内存
所以,祝你好运,以不同的方式思考你的东西
最后,如上所示对图像进行重新采样后,可以调用bitmap_file.recycle() 。
事实是,在某些Android版本中存在一个BUG,特别是2.1版本会一直出现这样的问题。
我发布了一个应用程序,在这个应用程序中我非常关心资源的使用情况。 我甚至删除了我正在使用的很多位图,而现在它们是使用图形原语实时创建的。 我也回收位图时,不使用它们。 当然,我已经检查了我的应用程序中没有内存泄漏:使用的内存不增长没有控制,它始终保持在合理的价值。
虽然我在尝试避免这个问题上投入了很多精力,但是我仍然从2.1和2.1-update1设备中得到了很多恼人的异常。 我现在正在使用暴力来报告崩溃,我已经看到,即使应用程序只使用4兆内存,这比每个Android设备必须具有的应用程序的堆大小16M少四倍,现在大多数设备的堆大小都大于16M。
我所有的位图大小都是800×480像素,在最坏的情况下,ARGB_8888可能每个都不会占用超过1.5MB的空间,但是当占用4兆字节时,它会崩溃尝试加载一个,所以至少应该有12MB自由。 而且我的大多数Bitmaps都是以占用一半内存的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();
调用垃圾收集器是一个好主意。