Android 图片异步加载

本文介绍了一种在Android应用中实现图片异步加载的方法。通过使用自定义的AsnycImageLoader类,可以有效地避免阻塞UI线程,并且利用缓存减少网络请求次数。该方法包括检查内存缓存中的图片,若不存在则从网络下载并更新UI。
摘要由CSDN通过智能技术生成
在Android开发过程中,为了防止阻塞UI,图片加载时经常采用异步的方法来加载,异步加载图片的主要流程是
进行判断缓存中是否存在图片,如果存在则直接返回,如果不存在则进行下载并进行缓存。
以下是建立一个异步下载类:
public class AsnycImageLoader {
	// 定义一个HashMap进行存放缓存的Image key为String Value为一个弱引用的一个资源文件
	// 图片 为了方便JAVA的回收
	private Map<String, SoftReference<Drawable>> imageCache = null;

	public AsnycImageLoader() {
		imageCache = new HashMap<String, SoftReference<Drawable>>();
	}

	/**
	 * 加载图片
	 * <p>
	 * imageurl为下载资源的URL, ImageCallback当缓存中不存在相关图片时时行网络下载 在多线程下要使用Handler进行操作UI
	 * 利用回调接口的方式进行更新UI
	 * </p>
	 * 
	 * @param imageUrl
	 * @param callback
	 * @return
	 */
	public Drawable loadDrawable(final String imageUrl,
			final ImageCallback callback) {
		// 进行判断ImageCache中是否存在缓存图片
		if (imageCache.containsKey(imageUrl)) {
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			if (softReference.get() != null) {
				return softReference.get();
			}
		}
		// 定义操作UI的Handler
		final Handler handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				callback.imageLoaded((Drawable) msg.obj);
			}
		};

		new Thread(new Runnable() {
			@Override
			public void run() {
				Drawable drawable = loadImageFromUrl(imageUrl);
				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
				Message message = handler.obtainMessage(0, drawable);
				handler.sendMessage(message);
			}
		}).start();
		return null;
	}

	// 根据URL地址进行获取资源
	protected Drawable loadImageFromUrl(String imageUrl) {
		try {
			return Drawable.createFromStream(new URL(imageUrl).openStream(),
					"src");
		} catch (Exception e) {
			throw new RuntimeException();
		}
	}

	// 回调接口
	public interface ImageCallback {
		public abstract void imageLoaded(Drawable drawable);
	}
}
Activity:
public class MainActivity extends Activity {

	private AsnycImageLoader loader = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		loader = new AsnycImageLoader();

		loadImage("http://www.jb51.net/images/icon-partners.png", R.id.image2);
		loadImage("http://www.jb51.net/images/icon-dev.png", R.id.image2);
		loadImage("http://pic28.jb51.net/20130421/12302174_231210305323_2.jpg",
				R.id.image3);
	}

	public void loadImage(String url, int id) {
		final ImageView imageView = (ImageView) findViewById(id);
		Drawable cacheImage = loader.loadDrawable(url,
				new AsnycImageLoader.ImageCallback() {
					@Override
					public void imageLoaded(Drawable drawable) {
						imageView.setImageDrawable(drawable);
					}
				});
		if (cacheImage != null) {
			imageView.setImageDrawable(cacheImage);
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值