Android在拍照时出现内存不足问题

7
我有一个Activity,用于拍照(使用最高可能的分辨率,因此相当大),应用程序随后有机会对它们进行分析。一次只处理一张照片。问题在于,在4-5张照片后,我遇到了“内存不足”的问题。我看到dalvikvm-heap的输出,指出一个5070745字节的分配已经用完,接着是Camera-JNI的输出,指出无法为JPEG数据分配字节数组。我的应用程序没有崩溃,但似乎相机从这一点开始无法提供图像。我关注我的应用程序中的内存使用情况,但在这里似乎存在某个外部的内存泄漏,我想知道如何应对这种情况。是否有任何解决方案可用?
2个回答

10

这可能不完全是你想要的,但为了在网格视图上显示多个大图片(4-6 MB),我发现可以使用以下代码创建质量较低的较小位图,以避免内存不足的情况:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
options.inPurgeable = true;
options.inInputShareable = true;
Bitmap bm = BitmapFactory.decodeFile("/sdcard/myapp/" + filesFound.get(position), options);

重要的是选项,通过变更设置,我成功将内存从可能导致崩溃的水平减少到在使用inSampleSize之后约为28MB。同时,启用inPurgeable和inInputShareable设置进一步减少了内存占用。虽然我的Activity仍然有些迟缓,但已经好多了。

对于您的应用程序,如果它能够分析位图,则上述代码可以缩小内存使用量,使其运行起来。因为我还是Android新手,所以这可能根本行不通.. ;-)

敬礼,

Kevin


3

由于您在保存4-5张图片后就会耗尽内存,可能是因为在将其保存到SD卡后没有调用yourBitmap.recycle(); 方法?

此外,在onPictureTaken()方法中,如果您不需要alpha通道,则可以使用Bitmap.Config.RGB_565将图片的tempData保存到位图中,而不是使用ARGB(默认值)。

   // Create options to help use less memory   
    Options opt = new Options();
    opt.inPreferredConfig = Bitmap.Config.RGB_565;

   // Decode the tempdata into a bitmap, with the options as the last argument 
    bitmapFromRawCameraTempData = BitmapFactory.decodeByteArray(rawCameraTempData, 0, rawCameraTempData.length, opt);

我使用了这个,但它无法解决我的内存问题?我也不应该使用inSampleSize。我还能做些什么? - atasoyh
你可以看一下WeakReference,也许能帮到你: https://weblogs.java.net/blog/2006/05/04/understanding-weak-references - DecodeGnome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接