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

OutOfMemoryError:位图大小超过VM预算:-Android,android,bitmap,out-of-memory,Android,Bitmap,Out Of Memory,可能重复: 我正在从Url下载图像并显示它们。在下载时,它给出了 内存不足错误:位图大小超过VM预算。 我用的是drawable。代码如下: HttpClient httpclient= new DefaultHttpClient(); HttpResponse response=(HttpResponse)httpclient.execute(httpRequest); HttpEntity entity= response.getEntity(); BufferedHttpEntity b

可能重复:

我正在从Url下载图像并显示它们。在下载时,它给出了 内存不足错误:位图大小超过VM预算。 我用的是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`

这个问题似乎已经被报道了好几次,例如。。。 抱歉Shalini,但如果是同一个问题,似乎根本没有解决方案

罗曼·盖伊唯一的建议是


因此,祝你好运,以不同的方式思考你的东西…

你可以检查图像大小,然后通过适当的因子对其进行采样


查看此问题:

最后,按照上述建议对图像进行重新采样后,您可以调用。

使用decodeStreamis、outPadding、opts with


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

Runtime.getRuntime().gc();

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

事实上,一些Android版本上有一个BUG,特别是2.1版总是出现类似这样的问题

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

虽然我已经投入了大量的精力试图避免这个问题,但我仍然从2.1和2.1-update1设备中得到了很多恼人的异常。我现在使用critercism来报告崩溃,我已经看到,即使应用程序使用的内存只有4兆字节,也会发生崩溃,这比每个Android设备必须具有的16M堆大小小四倍——事实上,现在大多数设备的堆大小都大于16M

我所有的位图都有800x480像素的大小,在最坏的情况下,如ARGB_8888,每个位图可能占用的空间不超过1.5MB,但在仅占用4兆字节的情况下,加载位图时会崩溃,因此至少还有12兆的空闲空间。我的大多数位图都是以ARGB_4444的形式加载的,它占用了一半的内存,我只在使用4444时位图看起来很差时才使用ARGB_8888


所以对我来说,很明显,这些安卓版本中有一些东西工作不正常。99'9%的崩溃来自2.1和2.1-update,其余的可能是由于其他准时原因造成的

我试过很多方法,这就是有效的方法

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();

有一个解决方案:使用的内存少于允许的最大值。我知道这是一个令人沮丧的答案,但手机不像台式机那样有无限的内存。你得小心点,我不知道你会被解雇;正如我所说,你的建议是少用内存。。。你建议怎么做?减少图片的大小?@Rominguy P.S.现在是2020年,我的手机有4GB内存。这并没有显式地调用垃圾收集器,但它建议虚拟机这样做。如果你泄漏内存,这绝对不会起任何作用。垃圾收集只回收那些没有任何其他东西挂在引用上的对象。如果图像真的很大,这个解决方案应该对你好,Marcelo Cantos。。图像的高度和宽度=320x320找出你可以用多少方法获取图像,这样你就不会发现永恒的记忆问题,,,我已经尝试过了。。。但是主要的问题是VM…我知道我有点晚了,但是如果生成了图像并且在创建它的时候img=Bitmap.createBitmapsize.x,size.y,Bitmap.Config.ARGB_8888;它会崩溃吗?请求垃圾收集不会清除内存泄漏。谢谢,我的应用程序正在工作!谢谢,我们几个月来一直在寻找解决方案
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();