图片异步加载

图片异步加载在android应用开发中经常用到,网上有很多的实现方式,这里给出一个示例供参考。

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 (Exception e) {
			e.printStackTrace();
		}
		return BitmapFactory.decodeStream(i);
	}

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

上面这种方式比较常规,一般人都能想到。其实还有一种更简单的方式来做异步加载,这里我们使用到AQuery。引用其文档上一句原话,Android-Query(AQuery) is a light-weight library for doing asynchronous tasks and manipulating UI elements in Android.Our goal is to make Android coding simpler,easier,and more fun!呵呵,看到句话是不是立马不淡定了。。。。这里给出文档连接,里面有各种我们想看到的sample:http://code.google.com/p/android-query/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值