`
陈志琴
  • 浏览: 23083 次
  • 性别: Icon_minigender_2
  • 来自: 江西
社区版块
存档分类
最新评论

android 异步加载图片

阅读更多

 

ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的

 

所以这里就需要把这些信息利用多线程实现异步加载

 

实现这样功能的类:

 

public class AsyncImageLoader {
	private HashMap<String, SoftReference<Drawable>> imageCache;

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

	// 下载图片
	public static Drawable loadImageFromUrl(String url) {
		InputStream localInputStream = null;
		try {
			localInputStream = (InputStream) new URL(url).getContent();
			Drawable localDrawable = null;
			if (localInputStream != null)
				localDrawable = Drawable.createFromStream(localInputStream,
						"src");
			return localDrawable;
		} catch (Exception localException) {
			localException.printStackTrace();
			return null;
		}
	}

	public HashMap<String, SoftReference<Drawable>> getImageCache() {
		return imageCache;
	}

	public void setImageCache(
			HashMap<String, SoftReference<Drawable>> imageCache) {
		this.imageCache = imageCache;
	}

	@SuppressWarnings("unchecked")
	public Drawable loadDrawable(String imageURL,
			ImageCallback paramImageCallback) {

		boolean bool = this.imageCache.containsKey(imageURL);
		Drawable localDrawable = null;
		if (bool) {
			localDrawable = (Drawable) ((SoftReference) (imageCache)
					.get(imageURL)).get();
			return localDrawable;
		} else {
			ImageHandler imageHandler = new ImageHandler(this,
					paramImageCallback, imageURL);
			new ImageThread(this, imageURL, imageHandler).start();
		}
		return localDrawable;
	}

public abstract interface ImageCallback {
		public abstract void imageLoaded(Drawable drawable, String imageUrl);
	}

	class ImageHandler extends Handler {
		AsyncImageLoader asyncImageLoader;
		ImageCallback imageCallback;
		String imageUrl;

		public ImageHandler(AsyncImageLoader asyncImageLoader,
				ImageCallback paramImageCallback, String paramString) {
			this.asyncImageLoader = asyncImageLoader;
			this.imageCallback = paramImageCallback;
			this.imageUrl = paramString;
		}

		public void handleMessage(Message paramMessage) {
			if (this.imageCallback != null) {
				Drawable localDrawable = (Drawable) paramMessage.obj;
				// 将图片和图片的URL 传给回调函数,在回调函数中进行相应操作。
				imageCallback.imageLoaded(localDrawable, this.imageUrl);
			}
		}
	}

	class ImageThread extends Thread {
		private AsyncImageLoader asyncImageLoader;
		private String imageURL;
		private ImageHandler imageHandler;

		public ImageThread(AsyncImageLoader asyncImageLoader, String imageURL,
				ImageHandler imageHandler) {
			this.asyncImageLoader = asyncImageLoader;
			this.imageURL = imageURL;
			this.imageHandler = imageHandler;
		}

		public void run() {
			Drawable localDrawable = AsyncImageLoader
					.loadImageFromUrl(this.imageURL);
			// 将新下载的图片存入imageCache
			HashMap imageCache = asyncImageLoader.getImageCache();
			String str = this.imageURL;
			SoftReference localSoftReference = new SoftReference(localDrawable);
			imageCache.put(str, localSoftReference);
			Message localMessage = this.imageHandler.obtainMessage(0,
					localDrawable);
			// 将图片 通过消息发送给hander
			this.imageHandler.sendMessage(localMessage);
		}
	}
}

 注意这里使用了 SoftReference来缓存图片,允许 GC在需要的时候可以对缓存中的图片进行清理。它这样工作:

 

<!--[if !supportLists]-->l         <!--[endif]-->调用 loadDrawable(ImageUrl, imageCallback),传入一个匿名实现的 ImageCallback接口

<!--[if !supportLists]-->l         <!--[endif]-->如果图片在缓存中不存在的话,图片将从单一的线程中下载并在下载结束时通过 ImageCallback回调

<!--[if !supportLists]-->l         <!--[endif]-->如果图片确实存在于缓存中,就会马上返回,不会回调 ImageCallback

 

分享到:
评论

相关推荐

    Android异步加载图片例子

    在这个"Android异步加载图片例子"中,我们将探讨如何在Android应用中实现这一功能。 首先,我们需要理解Android的主线程(UI线程)与工作线程的区别。主线程负责处理用户界面交互,而工作线程则用于执行耗时操作,...

    android异步加载图片

    "Android异步加载图片"是一个常见的需求,它涉及到用户体验优化、内存管理以及线程安全等多个方面。这里我们将深入探讨这个主题,并结合提供的"ImageLoader-develop"可能是一个图片加载库的源码,来讲解相关的知识点...

    Android 异步加载图片实现_图片缓存.zip

    综上所述,Android异步加载图片和缓存策略是提升应用性能的关键技术。通过合理使用工作线程和缓存机制,可以显著改善用户体验,降低系统负载。在实际开发中,选择合适的图片加载库,并结合最佳实践,能够帮助我们...

    Android 异步加载图片缓存优化.rar

    总的来说,Android异步加载图片缓存优化是通过合理利用内存和磁盘资源,配合高效的异步处理,为用户提供流畅的图片浏览体验,同时避免了由于大图加载引发的内存问题。开发者可以通过学习这个压缩包中的源码和文档,...

    android异步加载图片缓存释放

    本话题主要围绕"android异步加载图片缓存释放"展开,我们将深入探讨如何实现这个功能以及相关的知识点。 首先,异步加载图片的目的是为了让用户在浏览应用时不会因为网络请求而等待,提高应用的响应速度。通常,...

    android 异步加载 图片

    总的来说,Android异步加载图片涉及到内存管理、线程调度、缓存策略等多个方面,合理地运用这些技术可以显著提升应用的性能和用户体验。通过不断学习和实践,开发者可以掌握更多关于图片加载的高级技巧,例如,利用...

    Android异步加载图片

    这个项目"Android异步加载图片"显然旨在演示如何在Android Studio环境下有效地实现这一功能。下面将详细介绍这个主题,包括相关知识点和可能的实现方式。 1. **线程管理**: Android主线程(UI线程)负责处理用户...

    android异步加载图片源码

    本文将深入探讨Android异步加载图片的原理,并以`AsyncListImage`为例,解析其源码,展示如何实现这一功能。 首先,理解异步加载的基本概念。异步加载(Asynchronous Loading)是一种编程策略,它允许程序在后台...

    android异步下载图片

    在Android开发中,异步加载图片是一个非常常见的需求,特别是在构建UI时,为了提供良好的用户体验,我们通常会避免在主线程中执行耗时的操作,如网络请求和图片解码。本教程将深入探讨如何利用异步操作来实现从...

    安卓源码包android图片缓存&展示Android 异步加载图片等24个合集.zip

    安卓源码包android图片缓存&展示Android 异步加载图片等24个合集: ‘360全景查看demo.rar afinal框架实现图片的简单异步缓存加载.rar andengine中直接加载多张小图片合成一张大图片生成动画精灵.rar android gif...

    android异步加载图片Demo

    "android异步加载图片Demo"是一个示例项目,它演示了如何利用Android的`AsyncTask`来解决这个问题。`AsyncTask`是Android提供的一种轻量级的异步处理机制,用于在后台线程执行耗时操作,然后在UI线程更新结果,以...

    android 异步加载图片 完美版

    在Android开发中,异步加载图片是一项至关重要的技术,特别是在处理大量图片或者网络图片时,为了提高用户体验,避免UI线程阻塞,我们通常会采用异步加载的方式。本资源"android 异步加载图片 完美版"提供了一种高效...

Global site tag (gtag.js) - Google Analytics