项目是一个图片社区项目,在浏览大图时有的手机会经常出现内存溢出,有的手机则不会。图片浏览大概是这样的:请求服务器获取整个图片信息列表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

解决方案 »

  1.   

    listView列表显示图片很少内存溢出,只有在listView列表显示的图片非常多的时候才会,大图浏览页面就经常会溢出,listView列表已经是加载大图了。内存溢出多半是出现在bitmap = BitmapFactory.decodeStream(is);
      

  2.   

    8是这样玩滴
    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是算出来滴根据你需要显示的图片大小。
      

  3.   

    BitmapFactory.Options opt = new BitmapFactory.Options();    
    opt.inJustDecodeBounds = false;  
    opt.inSampleSize = 5;
    //在bitmap赋值前加上上面这段代码应该就行了,具体作用我也不清楚,但是能够解决问题
    bitmap= BitmapFactory.decodeFile(sdCardPath+iName,opt);