【问题标题】:java.lang.OutOfMemoryError: Failed to allocate a 31961100 byte allocation with 15257484 free bytes and 14MB until OOMjava.lang.OutOfMemoryError:无法分配 31961100 字节分配,其中 15257484 可用字节和 14MB 直到 OOM
【发布时间】:2015-09-25 21:15:17
【问题描述】:

我正在做如下缩放的位图

 Bitmap resizedBitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(picturePath), 960, 730, false);

在进行此处理时,我有时会上传图像,但遇到类型错误

java.lang.OutOfMemoryError: Failed to allocate a 31961100 byte allocation with 15257484 free bytes and 14MB until OOM

请帮我解决一下?

【问题讨论】:

  • 使用BitmapFactory.Options 对象作为decodeFile() 的第二个参数。将BitmapFactory.Options 上的inSampleSize 设置为使您接近所需缩放大小的值。
  • 您的操作将需要比可用内存更多的内存。您希望我们提供什么样的解决方案/帮助?
  • @CommonsWare 请举例说明如何使用 BitmapFactory.Options?
  • @anderas 请给我解决方案如何增加内存?

标签: android


【解决方案1】:

这就是你可以使用BitmapFactory.Options的方法:

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
options.inTempStorage = new byte[16 * 1024];

Bitmap bmp = BitmapFactory.decodeFile(picturePath,options);
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bmp, 960, 730, false);

您还可以通过编写自定义函数为您的位图计算inSampleSize

这里是谷歌文档:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

您可以通过在清单中添加android:largeHeap="true" 来增加分配给您的应用程序的内存。

注意:为您的应用程序增加heap 并不是一个理想的解决方案。

这是来自谷歌的解释,

但是,请求大堆的能力仅适用于 可以证明需要消耗更多 RAM 的一小部分应用程序(例如 作为大型照片编辑应用程序)。永远不要简单地请求大堆 因为你的内存已经用完了,你需要一个快速修复——你应该 仅当您确切知道所有内存在哪里时才使用它 分配以及为什么必须保留它。然而,即使你很自信 您的应用程序可以证明大堆是合理的,您应该避免要求它 任何可能的程度。使用额外的内存将越来越多 不利于整体用户体验,因为垃圾 收集将花费更长的时间并且系统性能可能会变慢 任务切换或执行其他常见操作。

这是文档https://developer.android.com/training/articles/memory.html的完整链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多