【问题标题】:Android out of memory error on choosing second imageAndroid 在选择第二张图片时出现内存不足错误
【发布时间】:2013-08-07 22:13:13
【问题描述】:
我的应用程序的工作方式是退出主要活动,启动第二个活动,显示用户选择的图像并分析图像。
分析完第一张图片后,我使用后退按钮回到主Activity,再次进入第二张Activity选择第二张图片。但是一旦用户选择了第二张图片,android就会给我一个内存不足的错误。我尝试跟踪可用内存。奇怪的是,在选择第二张图像之前,可用内存比选择第一张图像之前还要多。
我应该如何解决这个问题?
谢谢!
PS 代码在
BitmapFactory.decodeFile(picturePath);
【问题讨论】:
标签:
android
memory
out-of-memory
main-activity
【解决方案1】:
如果您在 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;
}
【解决方案2】:
假设您正在使用 Bitmap 类,您应该在使用完位图实例后调用 recycle() 方法。
@Override
protected void onDestroy(){
super.onDestroy();
mBitmap.recycle();
}