实现异步加载图片

项目中会经常用到异步加载图片并保存到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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值