为了账号安全,请及时绑定邮箱和手机立即绑定

android-创建位图时出现内存不足异常

android-创建位图时出现内存不足异常

白衣非少年 2019-11-04 10:27:04
第二次创建位图后,出现以下错误:04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budgetthis._profileBitmap = Bitmap.createBitmap(_profileBitmap, xCoor,  yCoor, width, height);从日志:04-17 18:27:57.500: INFO/CameraCropView(3458): Original Photo Size: W 1536 x H 2048   04-17 18:28:06.170: INFO/CameraCropView(3458): xCoor: 291   04-17 18:28:06.170: INFO/CameraCropView(3458): yCoor: 430    04-17 18:28:06.170: INFO/CameraCropView(3458): Width: 952  04-17 18:28:06.170: INFO/CameraCropView(3458): Height: 952  由于图像很大,我得到了错误。但是有趣的是,错误不会第一次发生,只有在第二次拍照时才发生,这使我相信此profileBitmap不会被破坏。我该如何清理?
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我有同样的问题,并通过以下方式解决:


我的应用程序大小约为18MB,当我看到还有多少可用空间时,我感到震惊-654KB(在1GB RAM上!)。因此,我几乎删除了项目中的几乎所有图像,并在首次启动时从互联网上下载了它们,并在需要时使用SD卡中的图片。


要检查您的应用使用的总内存/可用内存,请执行以下操作:


 Runtime.getRuntime().totalMemory();

 Runtime.getRuntime().freeMemory();

编辑:我忘记了主要的事情-在您的清单中添加应用程序标记之间的这一行:


android:largeHeap="true"


查看完整回答
反对 回复 2019-11-04
?
FFIVE

TA贡献1797条经验 获得超6个赞

Android上的位图存在内存异常的许多问题,其中许多是在stackoverflow上讨论的。如果您遍历现有问题,看看是否与现有问题之一匹配,那将是最好的选择;否则,写下导致您的情况有所不同的原因。

查看完整回答
反对 回复 2019-11-04
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

android位图处理技巧


现在,这里是您可以遵循的提示,可以避免Android应用程序中的内存不足异常。


始终使用活动上下文而不是应用程序上下文。因为无法对应用程序上下文进行垃圾回收。并在活动结束时释放资源。(对象的生命周期应与活动的生命周期相同)。

2。活动结束时。检查HEAP DUMP(Android Studio中的内存分析工具)。


如果HEAP DUMP中已完成活动的对象中存在内存泄漏。查看您的代码,找出导致内存泄漏的原因。


始终使用inSampleSize

现在inSampleSize是什么?借助inSampleSize,您实际上是在告诉解码器不要抓取内存中的每个像素,而要抓取子样本图像。与原始图像相比,这将导致较少数量的像素要加载到内存中。您可以告诉解码器从原始图像中抓取第4个像素或每2个像素。如果inSampleSize为4,则解码器将返回一个Image,该Image是原始图像中像素数的1/16。


那么您节省了多少内存?计算 :)


在加载到内存之前,请先阅读“位图尺寸”。


如何在将图像加载到内存之前读取位图尺寸可以帮助您避免

内存不足错误?让我们来学习


使用inJustBounds = true


这是一种技术的帮助,您可以在将其加载到内存之前获取图像尺寸


 BitmapFactory.Options options = new BitmapFactory.Options();

 options.inJustDecodeBounds = true;

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage,    options);

 int imageHeight = options.outHeight;

 int imageWidth = options.outWidth;

 String imageType = options.outMimeType;

上面的代码片段不会提供任何图像/位图。对于位图对象,它将返回null。但它肯定会返回该图像的宽度和高度。这是R.id.myimage。


现在您有了Image的宽度和高度。您可以根据以下因素放大或缩小图像:


用于显示图像的ImageView大小。

可用内存量。您可以使用ActivityManager和getMemoryClass检查可用的内存量。

屏幕尺寸和设备密度。


使用适当的位图配置

位图配置是图像的颜色空间/颜色深度。Android中的默认位图配置为RGB_8888,每像素4个字节。


如果使用RGB_565颜色通道,则每个像素使用2个字节。相同分辨率的一半内存分配:)


将inBitmap属性用于回收目的。


不要制作静态Drawable Object,因为它不能被垃圾回收。


在清单文件中请求大堆。


如果您要执行大量图像处理(内存密集型任务)或使用NDK(使用c,c ++进行本机开发),请使用多个过程


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 598 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信