图片异步加载1

在android的ListView里面、我们常常需要用到图片的异步加载来展示一些图片、

实现异步加载的核心代码如下、

public class ImageLoaderByTag {
	
	private HashMap<String,SoftReference<Drawable>> imageCache;//使用软引用,可以由系统在恰当的时候更容易回收
	
	public ImageLoaderByTag(){
		imageCache = new HashMap<String,SoftReference<Drawable>>();
	}
	
	
	/**
	 * 通过url获取图片
	 * @param url
	 * @return
	 */
	public Drawable getDrawable(String url){
		
		 Drawable drawable = null;
		 URL request; 
		 InputStream is;
		 try{
			 request = new URL(url);
			 is = (InputStream)request.getContent();
			 drawable = Drawable.createFromStream(is, "src");
			 
		 }catch(Exception e){
			 drawable = null;
			 LogUtils.logE(e.getMessage());
		 }catch(OutOfMemoryError e){
			 LogUtils.logE("错误:"+e.getMessage());
			 drawable = null;
			 System.gc();
		 }
		  
		return drawable;
	}
	
	/**
	 * 异步加载图片
	 * @param url
	 * @param imageCallback
	 */
	public void asynLoadDrawable(final TagInfo tagInfo,final ImageCallback imageCallback){
		
		
		Drawable drawable = null;
		if(imageCache.containsKey(tagInfo.getUrl())){
			drawable = imageCache.get(tagInfo.getUrl()).get();
			if(null!=drawable){
				imageCallback.Image(tagInfo,drawable,false);
				return;
			}
		}
		
		
		final Handler handler = new Handler(){
			
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				
				Drawable drawable = (Drawable)msg.obj;
				if(drawable!=null){
					imageCache.put(tagInfo.getUrl(), new SoftReference<Drawable>(drawable));
					TagInfo tag = tagInfo;
					tag.setDrawable(drawable);
					imageCallback.Image(tag,drawable,true);
					
				}
				
			}
		};
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				
				handler.obtainMessage(1, getDrawable(tagInfo.getUrl())).sendToTarget();
				
			}
		}).start();
		
		
	}
	
	
	/**
	 * 回调接口
	 *
	 */
	public interface ImageCallback{
		
		public void Image(TagInfo tagInfo,Drawable drawable,boolean isFirst);
		
	}

}


用到的TagInfo实体类、

public class TagInfo {
	
	private int position;
	private String url;
	private Drawable drawable;
	public int getPosition() {
		return position;
	}
	public void setPosition(int position) {
		this.position = position;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public Drawable getDrawable() {
		return drawable;
	}
	public void setDrawable(Drawable drawable) {
		this.drawable = drawable;
	}

	
	
}


在这里、图片异步加载就实现了、想要用到异步加载的时候、我们只需要在自定义Adapter的里面实例化一个ImageLoaderTag、然后在自定义的Adapter的getView();方法里面直接调用方法asynLoadDrawable、

	
	TagInfo tag = new TagInfo();  
        tag.setPosition(position);  // 保存了当前在adapter中的位置  
    	tag.setUrl(url);         // 保存当前项所要加载的url 
	imageView.setTag(tag); 
	
	imgeLoader.asynLoadDrawable(tag,new ImageCallback() {
		@Override
		public void Image(TagInfo tagInfo,Drawable drawable,boolean isFirst) {

			ImageView iv = (ImageView)lv_list.findViewWithTag(url);
			if(null!=iv&&drawable!=null){
				iv.setImageDrawable(drawable);
			}
		}
	});
	

这样ListView图片异步加载就实现了、


测试效果图:

   




posted @ 2013-08-23 10:56  Jenly  阅读(175)  评论(0编辑  收藏  举报