我的应用程序通过逐步退出主要活动,启动第二个活动,显示用户选择的图像并分析图像。
在分析完第一张图片后,我使用后退按钮返回主要活动,然后再次进入第二个活动以选择第二张图像。但是一旦用户选择第二个图像,android就会给我一个内存不足的错误。我试着跟踪可用的内存。奇怪的是,在选择第二个图像之前,可用的内存比第一个图像选择之前的内存更多。 我该如何解决这个问题? 谢谢!
PS代码耗尽内存 BitmapFactory.decodeFile(picturePath);
答案 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;
}