java.lang.OutOfMemoryError:无法分配31961100字节分配15257484个空闲字节和14MB直到OOM

时间:2015-09-25 12:50:40

标签: android

我正在按比例缩小地图

 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

请帮我解决一下怎么办?

1 个答案:

答案 0 :(得分:6)

这是您使用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

此处的Google文档:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

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

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

这是谷歌提取的解释,

  

但是,请求大堆的功能仅适用于a   一小组应用程序,可以证明需要消耗更多的RAM(例如   作为一个大型照片编辑应用程序)。永远不要简单地请求大堆   因为你已经没有内存而你需要快速修复 - 你应该这样做   只有当你确切知道所有记忆的存在时才使用它   分配以及必须保留的原因。然而,即使你有信心   你的应用程序可以证明大堆的合理性,你应该避免请求它   尽可能的。使用额外的内存将越来越多   因为垃圾而损害整体用户体验   收集将花费更长时间,系统性能可能会更慢   任务切换或执行其他常见操作。

这里是文档https://developer.android.com/training/articles/memory.html

的完整链接