关于Bitmap内存溢出问题

在做一个新闻客户端列表的时候遇到了这个问题,加载50条数据左右就内存溢出了.打印看了下100kb的图片变成Bitmap大概有1MB,可想而知这个内存消耗有好大;

谷歌搜索解决方案,大概方向:

1,压缩Bitmap

2,使用软引用(不知道怎么用)

3,使用磁盘缓存

最后我选择了使用磁盘缓存,,,,,,,但是,,尼玛什么时候释放内存进行缓存呢???试了几种释放内存的时机,都没有很好的结果,,,最后,找到了一个开源框架,一个只需要导入jar包(没有资源文件所以可以只用导入jar包)的Android框架,太爽了,太好用了!!!

两句代码解决问题(其中一句只用执行一次)有木有,什么后台图片下载,什么子线程修改UI,什么缓存,什么什么都解决了!

项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

下载后找到simple/libs/universal-image-loader-1.8.7-snapshot-with-sources.jar拷贝到你的项目libs下面就行了;

//初始化环境,可以设置缓存位置等等,这里使用默认的/data/data/package/cache/
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));


//如果你是想加载一张图片,但是不是放到ImageView上面那么你可以这样
ImageLoader.getInstance().loadImage(uri, listener);

//如果是要放到ImageView上面那你就这样,推荐这样使用
ImageLoader.getInstance().displayImage(uri, imageView);

就这么就好了;

需要注意的是上面那样使用并没有使用缓存,只是保证了内存不会溢出,如果你想使用内存缓存或者磁盘缓存你应该这样:

//初始化配置信息,这里面可以设置图片尺寸,磁盘缓存位置,线程池大小,内存缓存大小,磁盘缓存大小,磁盘缓存数量等等....
//这个只需要执行一次,
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));

//设置图片显示相关细节,这里可以设置:是否使用内存缓存,是否使用磁盘缓存,图片显示方式(滤镜),图片加载中显示什么东西,加载失败显示什么,延迟加载等等...
public static final DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder().cacheInMemory(true)
            .cacheOnDisc(true).build();

//加载一张图片到ImageView上面
ImageLoader.getInstance().displayImage(url, imageView,displayImageOptions);

这个代码写的水平太高了,可定制性非常强!!!

这里面还带有滤镜什么的,默认的好像有圆角,透明,还有个不知道什么东西;

更多功能请下载项目观看示例!!!

原文地址:https://www.cnblogs.com/moqi2013/p/3384518.html