项目是一个图片社区项目,在浏览大图时有的手机会经常出现内存溢出,有的手机则不会。图片浏览大概是这样的:请求服务器获取整个图片信息列表listView显示。这时已经是异步加载显示大图了,因为是listView列表显示图片还有图片的一些其他信息之类的,所以图片的imageView设置一个固定的大小(比实际图片要小一点,是设置属性android:scaleType="centerCrop")。点击图片是进入完整的大图浏览页面。整个Activity布局是代码实现的(包括一张背景,上一张按钮,下一张按钮,返回按钮,图片说明按钮,imageView)。进入大图浏览显示大图有一下几个步骤:1、查看CachedFile存不存在图片,存在就处理显示。2、CachedFile不存在就请求网络下载图片bitmap = BitmapFactory.decodeStream(is);保存到本地,再处理显示。因为图片可能会比较大所以每张图片显示前都是这样处理的public static Bitmap resizeBitmap(final File f) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPurgeable = true;
if (f.length() < 20480) { // 0-20k
opts.inSampleSize = 1;
} else if (f.length() < 51200) { // 20-50k
opts.inSampleSize = 1;
} else if (f.length() < 307200) { // 50-300k
opts.inSampleSize = 1;
} else if (f.length() < 819200) { // 300-800k
opts.inSampleSize = 2;
} else if (f.length() < 1048576) { // 800-1024k
opts.inSampleSize = 4;
} else {
opts.inSampleSize = 8;
}
try {
return BitmapFactory.decodeFile(f.getPath(), opts);
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
return null;
}
翻页显示是Intent intent = new Intent(ViewBigPicActivity.this,ViewBigPicActivity.class);
//intent 携带图片地址和id之内的信息
ViewBigPicActivity.this.startActivity(intent);
ViewBigPicActivity.this.finish();
内存溢出现象:有时是某张图片直接点击它显示就崩掉,有时是查看几张图片再崩掉(崩掉的图片也不只是那些很大的图片)
错误日志:Clamp target GC heap from 49.011MB to 48.000MB
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPurgeable = true;
if (f.length() < 20480) { // 0-20k
opts.inSampleSize = 1;
} else if (f.length() < 51200) { // 20-50k
opts.inSampleSize = 1;
} else if (f.length() < 307200) { // 50-300k
opts.inSampleSize = 1;
} else if (f.length() < 819200) { // 300-800k
opts.inSampleSize = 2;
} else if (f.length() < 1048576) { // 800-1024k
opts.inSampleSize = 4;
} else {
opts.inSampleSize = 8;
}
try {
return BitmapFactory.decodeFile(f.getPath(), opts);
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
return null;
}
翻页显示是Intent intent = new Intent(ViewBigPicActivity.this,ViewBigPicActivity.class);
//intent 携带图片地址和id之内的信息
ViewBigPicActivity.this.startActivity(intent);
ViewBigPicActivity.this.finish();
内存溢出现象:有时是某张图片直接点击它显示就崩掉,有时是查看几张图片再崩掉(崩掉的图片也不只是那些很大的图片)
错误日志:Clamp target GC heap from 49.011MB to 48.000MB
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o); // The new size we want to scale to
final int REQUIRED_SIZE = this.picsize; // Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale++;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap preview_bitmap = BitmapFactory.decodeStream(
new FileInputStream(f), null, o2);
return preview_bitmap;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
// return null;
这个size是算出来滴根据你需要显示的图片大小。
opt.inJustDecodeBounds = false;
opt.inSampleSize = 5;
//在bitmap赋值前加上上面这段代码应该就行了,具体作用我也不清楚,但是能够解决问题
bitmap= BitmapFactory.decodeFile(sdCardPath+iName,opt);