从res崩溃应用程序中设置ImageView中的大图像

时间:2012-10-04 02:22:45

标签: android imageview out-of-memory

我想在我的应用中使用.png文件。此图像相当大,大约328x32765像素,大小为751KB,位于我的res文件夹中。我尝试将此图像设置为我的布局时收到“java.lang.OutOfMemoryError:位图大小超过VM预算”的错误消息。

我不确定它是否相关,但我在同一页面上也有大约730个按钮,加载和工作正常,但我想也许那些按钮也使用了大量内存?

无论哪种方式,是否有一个简单的解决方案来帮助解决此问题或使我的.png图像使用更少的内存?

3 个答案:

答案 0 :(得分:2)

位图需要大量内存,如教程中所述 关于位图的android网站本身

Displaying Bitmaps

编辑:

尝试使用“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);