实现异步加载图片

原创 2013年12月02日 17:34:30

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

			}







相关文章推荐

Android 实现ListView异步加载图片

ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: Java代码  package cn.wangme...

Android实现异步加载图片

  • 2015年05月22日 01:06
  • 39KB
  • 下载

Android中实现异步加载图片的Demo

  • 2010年11月30日 11:12
  • 52KB
  • 下载

ListView异步加载图片实现思路(优化篇)

关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化,下面就让在下阐述其原理以探索个中奥秘。 在APP应用中,listview的异步加...

Android实现ListView异步加载图片

  • 2011年05月03日 11:18
  • 36KB
  • 下载

Android实现ListView异步加载图片

  • 2011年03月05日 12:56
  • 412KB
  • 下载

44.封装类实现异步加载图片

1.首先创建一个继承NSObject的在ImageDownLoader.h文件中在ImageDownLoader.m文件中 在RootViewController.m中...

Android实现ListView异步加载图片

  • 2014年07月29日 10:36
  • 27KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现异步加载图片
举报原因:
原因补充:

(最多只允许输入30个字)