关闭

实现异步加载图片

标签: android异步加载图片
698人阅读 评论(0) 收藏 举报
分类:

项目中会经常用到异步加载图片并保存到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);
				}

			}







0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:73788次
    • 积分:1157
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:51篇
    • 译文:0篇
    • 评论:14条