2010-05-28 66 views
53

Possible Duplicate:
Android: Strange out of memory issue while loading an image to a Bitmap object的OutOfMemoryError:位图大小超过VM预算: - 安卓

我是从网址下载图片并显示它们。在下载时,它给予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

+0

图像有多大? – 2010-05-28 09:54:10

+0

嗨,, Marcelo Cantos !!! ..高度和图像的宽度= 320x320 – Andy 2010-05-28 10:09:28

+0

找出你有多少种方式可以获取图像,以便你找不到内存问题 – 2010-05-28 10:23:13

回答

2

这个问题似乎已经报道了好几次,herehere例如... 对不起Shalini但如果是同样的问题,它似乎有没有解决方案?

罗曼盖伊的唯一建议是to use less memory...

所以,运气好能想到你的东西不同ly ...

+3

有一个解决方案:使用比允许的最大内存少的内存。我知道这是一个令人沮丧的答案,但手机没有像桌面机器那样的“无限量”内存。你必须要小心。 – 2010-05-28 17:35:14

+0

不知道你是来堆栈;)​​ 正如我所说,你的建议是使用更少的内存... 你会建议做什么呢?减少图片的大小? – Sephy 2010-05-29 22:32:42

31

使用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]; 
+0

谢谢,我的应用程序正在工作! – jucajl 2013-08-16 06:43:09

+2

谢谢,正在寻找一个月的解决方案 – sanjeev 2013-09-11 07:32:55

-2

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

Runtime.getRuntime().gc(); 

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

+6

这并没有明确地调用垃圾收集器,但它建议虚拟机来做。 – caw 2012-03-10 18:34:52

+0

如果你正在泄漏记忆,这将不会做任何事情。垃圾收集只回收没有其他任何东西挂在对它们的引用上的对象。 – 2013-02-04 21:42:12

0

事实上,在某些Android版本中存在一个BUG,特别是2.1版本一直出现这样的问题。

我发布了一个应用程序,在这个应用程序中,我在资源使用上花了很多心思。我甚至已经删除了许多我正在使用的位图,现在它们都是使用图形原语实时创建的。我还回收位图时不使用它们。当然,我已经检查过我的应用程序中没有内存泄漏:使用的内存不会在没有控制的情况下增长,它始终保持在合理的值内。

虽然我在尝试避免这个问题上投入了大量精力,但我仍然从2.1和2.1-update1设备中获得了许多恼人的异常。我现在正在使用暴力来报告崩溃事件,而且我已经看到,即使应用程序仅使用4 MB RAM,这比每个Android设备必须具有的应用程序堆大小16M少四倍,也会发生这种情况,事实上,目前大多数设备的堆大小都大于16M-。

我所有的位图大小都是800x480像素,在最坏的情况下,ARGB_8888可能每个都不会占用超过1.5MB的空间,但是当占用4兆字节时,它会崩溃尝试加载一个,所以应该有至少另有12 MB免费。而且我的大部分Bitmaps加载为占用一半内存的ARGB_4444,当位图与4444差别很大时,我只使用ARGB_8888.

因此,对于我来说很明显,这些Android版本中有一些是不能正常工作。 99.9%的崩溃来自2.1和2.1更新,其余可能由其他准时原因解释。

0

我试过很多东西,这是有效的。

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

请求垃圾收集不会清理内存泄漏。 – 2013-02-04 21:42:51

相关问题