项目中会经常用到异步加载图片并保存到SoftReference中,特此整理一下。
/**
* 异步加载图片,使用SoftReference 软引用
* 它的作用是管理内存,防止内存溢出,还可以缓冲一些drawable让我们直接使用,当内存不足时才自动回收这些引用对象
*
* @author Administrator
*
*/
public class AsyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache;//图片缓冲
public AsyncImageLoader(){
imageCache = new HashMap<String, SoftReference<Drawable>>();
}
/**
*
* @param imageUrl 图片地址
* @param imageView 需要设置drawable的view
* @param imageCallback 回调接口
* @return
*/
public Drawable loadDrawable(final String imageUrl,final ImageView imageView,final ImageCallback imageCallback){
//如果有drawable对象,直接返回它的引用
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
//对象有可能被系统回收了,需要判断是否为空
if(drawable != null){
return drawable;
}
}
//如果没有,则重新下载
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
imageCallback.imageLoaded((Drawable)msg.obj, imageView, imageUrl);
super.handleMessage(msg);
}
};
//新建一个线程下载图片
new Thread(){
public void run() {
Drawable drawable = Download.downloadDrawable(imageUrl);
//将下载的图片保存到缓冲中
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
};
}.start();
return null;
}
//回调接口,在这里面设置imageView的图片,直接imageView.setImageViewDrawable(imageDrawable);
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable,ImageView imageView,String imgageUrl);
}
}
调用处的使用方法如下:
Drawable weibo_image = asyncImageLoader.loadDrawable(
weibo.getThumbnail_pic(), weibo_ImgView,
new ImageCallback() {
@Override
public void imageLoaded(Drawable imageDrawable,
ImageView imageView, String imgageUrl) {
imageView.setImageDrawable(imageDrawable);
}
});
if (weibo_image == null) {
weibo_ImgView.setImageResource(R.drawable.trend_pic_loading);
} else {
weibo_ImgView.setImageDrawable(weibo_image);
}
}