OutOfMemoryError: bitmap size exceeds VM budget :- Android
Possible Duplicate:
Android: Strange out of memory issue while loading an image to a Bitmap object
我正在从Url下载图像并显示它们。 在下载时它给出
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(); |
这是错误:
使用
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(); |
调用垃圾收集器是个好主意。