我的应用程序通过退出主要活动,启动第二个活动,显示用户选择的图像并分析图像来工作。
分析完第一张图片后,我使用后退按钮返回主活动并再次进入第二个活动以选择第二张图片。但是一旦用户选择了第二张图片,android就会给我一个内存不足的错误。我尝试跟踪可用内存。奇怪的是,在选择第二张图像之前,可用内存比选择第一张图像之前还要多。我应该如何解决这个问题?谢谢!
PS代码在BitmapFactory.decodeFile(picturePath)处内存不足;
我的应用程序通过退出主要活动,启动第二个活动,显示用户选择的图像并分析图像来工作。
分析完第一张图片后,我使用后退按钮返回主活动并再次进入第二个活动以选择第二张图片。但是一旦用户选择了第二张图片,android就会给我一个内存不足的错误。我尝试跟踪可用内存。奇怪的是,在选择第二张图像之前,可用内存比选择第一张图像之前还要多。我应该如何解决这个问题?谢谢!
PS代码在BitmapFactory.decodeFile(picturePath)处内存不足;
假设您正在使用 Bitmap 类,您应该在完成位图实例后调用 recycle() 方法。
@Override
protected void onDestroy(){
super.onDestroy();
mBitmap.recycle();
}
如果您在 3.0 之前的硬件上运行,您看到的内存值将不包括位图使用的内存,因此这可能是您描述的行为的原因。
根据经验,您应该始终检查应用程序动态检索的图像尺寸(从用户选择或从网络中),并将其缩放到对您的应用程序有意义的大小。例如,对于图库应用程序,它应该将手机拍摄的图片重新缩放到屏幕尺寸。下面是用于解码缩放位图的代码示例:
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;
}