我想在我的应用中使用.png文件。此图像相当大,大约328x32765像素,大小为751KB,位于我的res文件夹中。我尝试将此图像设置为我的布局时收到“java.lang.OutOfMemoryError:位图大小超过VM预算”的错误消息。
我不确定它是否相关,但我在同一页面上也有大约730个按钮,加载和工作正常,但我想也许那些按钮也使用了大量内存?
无论哪种方式,是否有一个简单的解决方案来帮助解决此问题或使我的.png图像使用更少的内存?
答案 0 :(得分:2)
位图需要大量内存,如教程中所述 关于位图的android网站本身
编辑:
尝试使用“Bitmap.createScaledBitmap”(Bitmap,width,height,filter)函数;“或尝试使用教程中提到的“BitmapFactory.Options”类。
“BitmapFactory.Options”类有很多帮助,因为它的功能本身可以帮助开发人员通过缓存加载的位图来最小化VM在加载位图中的使用。
答案 1 :(得分:0)
虽然你的图像大731KB,实际的虚增位图大小将近41兆字节。 您收到错误是因为设备无法一次分配41MB 。
不幸的是,除了加载图像的缩小版本之外,没有其他方法可以解决这个问题。
使用Bitmap.Options类并指定缩放因子:
2 - 意味着使每一面缩小两倍
3 - 小三倍,......
x - x倍小
好消息是,由此产生的虚增位图大小将为41 /(x * x)MB:
2 - 41/4 = 10.25MB
3 - 41/9 = 4.5MB
4 - 41/16 = 2.6MB .....
试一试并在多台设备上进行测试。
或者,将图像分解为相当小的图像并使用没有边框或分隔符的ListView,这样您仍然可以看到平滑的图像,但ListView也会负责启动和丢弃这些图像。是必要的。 (请注意,您将失去水平滚动的功能,因为ListView仅垂直滚动 - 以防万一这是您的担忧。)
答案 2 :(得分:0)
Android无法处理大位图OOM错误将发生。它不是a =意外错误这是许多开发人员面临的一个大问题。搜索许多文档,你会发现有关OOM错误的探索。我在开发过程中也遇到了困难application.For。删除它,采样大图像是唯一的方法。
int scale = "Image byte length" / 320000;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = scale / 2 + scale % 2* 2;
decryptedimage=BitmapFactory.decodeByteArray(decryptedData,0,decryptedData.length,options);