异步加载网络图片

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

/**
 * 图片异步加载工具类
 * 
 * @version V1.0
 */
public class AsynImageLoader {

	// 图片软引用
	private HashMap<String, SoftReference<Bitmap>> imageCache;
	// 显示图片的ImageView
	private HashMap<String, ImageView> imageViews;

	public AsynImageLoader() {// 构造
		imageCache = new HashMap<String, SoftReference<Bitmap>>();
		imageViews = new HashMap<String, ImageView>();
	}

	/**
	 * 从网络上获取图片
	 * 
	 * @param imageView
	 *            显示图片的ImageView
	 * @param imageUrl
	 *            图片的地址
	 * @return 图片
	 */
	public Bitmap loadDrawableFromNet(final ImageView imageView,
			final String imageUrl) {
		return loadDrawable(imageView, imageUrl, new LoadCallBack() {
			public Bitmap load(String uri) {
				return loadImageFromNet(uri);
			}
		});
	}

	/**
	 * 从本地获取图片
	 * 
	 * @param imageView
	 *            显示图片的ImageView
	 * @param imageUrl
	 *            图片的路径
	 * @return 图片
	 */
	public Bitmap loadDrawableFromLocal(final ImageView imageView,
			final String imageUrl) {
		return loadDrawable(imageView, imageUrl, new LoadCallBack() {
			public Bitmap load(String uri) {
				return loadImageFromLocal(uri);
			}
		});
	}

	/**
	 * 获取图片
	 * 
	 * @param imageView
	 *            显示图片的ImageView
	 * @param imageUrl
	 *            图片路径或网络地址
	 * @param load
	 *            回调方法 加载本地图片或者加载网络图片
	 * @return
	 */
	private Bitmap loadDrawable(final ImageView imageView,
			final String imageUrl, final LoadCallBack load) {

		// 判断软引用里是否有图片
		if (imageCache.containsKey(imageUrl)) {
			SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
			Bitmap bitmap = softReference.get();
			if (bitmap != null) {
				return bitmap;// 有则返回
			}
		}

		// 将为添加到图片显示集合的 ImageViwe 加入到集合
		if (!imageViews.containsKey(imageUrl)) {
			imageViews.put(imageUrl, imageView);
		}

		final Handler handler = new Handler() {
			public void handleMessage(Message message) {
				imageViews.get(imageUrl).setImageBitmap((Bitmap) message.obj);
			}
		};

		//启动线程获取图片
		new Thread() {
			public void run() {
				Bitmap bitmap = load.load(imageUrl);//执行回调
				imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));
				Message message = handler.obtainMessage(0, bitmap);
				handler.sendMessage(message);
			}
		}.start();
		return null;
	}

	private interface LoadCallBack {
		public Bitmap load(String uri);
	}

	/**
	 * 从网络加载图片
	 * 
	 * @param url
	 * @return
	 */
	public Bitmap loadImageFromNet(String url) {
		URL m;
		InputStream i = null;
		try {
			m = new URL(url);
			i = (InputStream) m.getContent();
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return BitmapFactory.decodeStream(i);
	}

	/**
	 * 从本地加载图片
	 * 
	 * @param path
	 * @return
	 */
	public Bitmap loadImageFromLocal(String path) {
		return BitmapFactory.decodeFile(path);
	}
}

这个处理方式没有用到回调,没让ListView传入Adapter,没让Adapter里的代码显得那么臃肿,下面贴两行调用:

Bitmap cachedImage = loader.loadDrawableFromNet(item.imageView,url);
item.setImageBitmap(cachedImage);


核心的思想就是在加载类里面做一个集合来存放显示的ImageView

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值