在做一个新闻客户端列表的时候遇到了这个问题,加载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);
这个代码写的水平太高了,可定制性非常强!!!
这里面还带有滤镜什么的,默认的好像有圆角,透明,还有个不知道什么东西;
更多功能请下载项目观看示例!!!