猿问

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

第二次创建位图后,出现以下错误:


04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budget


this._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不会被破坏。我该如何清理?


白衣非少年
浏览 599回答 3
3回答

一只甜甜圈

我有同样的问题,并通过以下方式解决:我的应用程序大小约为18MB,当我看到还有多少可用空间时,我感到震惊-654KB(在1GB RAM上!)。因此,我几乎删除了项目中的几乎所有图像,并在首次启动时从互联网上下载了它们,并在需要时使用SD卡中的图片。要检查您的应用使用的总内存/可用内存,请执行以下操作: Runtime.getRuntime().totalMemory(); Runtime.getRuntime().freeMemory();编辑:我忘记了主要的事情-在您的清单中添加应用程序标记之间的这一行:android:largeHeap="true"

FFIVE

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

尚方宝剑之说

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 ++进行本机开发),请使用多个过程
随时随地看视频慕课网APP

相关分类

Android
我要回答