选择第二张图片时出现内存不足错误

时间:2013-08-07 22:13:14

标签: android memory out-of-memory main-activity

我的应用程序通过逐步退出主要活动,启动第二个活动,显示用户选择的图像并分析图像。

在分析完第一张图片后,我使用后退按钮返回主要活动,然后再次进入第二个活动以选择第二张图像。但是一旦用户选择第二个图像,android就会给我一个内存不足的错误。我试着跟踪可用的内存。奇怪的是,在选择第二个图像之前,可用的内存比第一个图像选择之前的内存更多。 我该如何解决这个问题? 谢谢!

PS代码耗尽内存     BitmapFactory.decodeFile(picturePath);

2 个答案:

答案 0 :(得分:0)

假设您正在使用Bitmap类,则应在完成位图实例后调用recycle()方法。

@Override 
protected void onDestroy(){
    super.onDestroy();
    mBitmap.recycle();
}

答案 1 :(得分:0)

如果您在3.0之前的硬件上运行,您看到的内存值将包含Bitmaps使用的内存,因此这可能是您所描述的行为的原因。

根据经验,您应该始终检查应用程序动态检索的图像尺寸(来自用户选择或网络),并将其缩放到对您的应用有意义的尺寸。例如,对于Gallery应用程序,它应该将手机拍摄的图片重新缩放到屏幕尺寸。下面是用于解码缩放的位图的代码示例:

private Bitmap decodeFile(File f, int width_tmp, int height_tmp, int maxSize) {
    try {
        // decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        InputStream in = new FileInputStream(f);
        BitmapFactory.decodeStream(in, null, o);
        try {
            in.close();
        } catch (IOException e1) {
        }
        // Find the correct scale value. It should be the power of 2.
        int scale = 1;
        while (maxSize > 0) {
            if (width_tmp / 2 < maxSize
                    || height_tmp / 2 < maxSize) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale++;
        }

        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        in = new FileInputStream(f);
        Bitmap bm = BitmapFactory.decodeStream(in, null, o2);
        try {
            in.close();
        } catch (IOException e1) {
        }
        return bm;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}