首页 > 代码库 > 图片缓存工具类

图片缓存工具类

public class ImageCache {
	static private ImageCache cache;// 一个Cache实例
	private Hashtable<String, ImageRef> ImageRefs;// 用于Chche内容的存储
	private ReferenceQueue<Image> q;// 垃圾Reference的队列

	// 继承SoftReference,使得每一个实例都具有可识别的标识。
	private class ImageRef extends SoftReference<Image> {
		private String key = "";

		public ImageRef(Image im, ReferenceQueue<Image> q) {
			super(im, q);
			key = im.getId();
		}
	}

	// 构建一个缓存器实例
	private ImageCache() {
		ImageRefs = new Hashtable<String, ImageRef>();
		q = new ReferenceQueue<Image>();

	}

	// 取得缓存器实例

	public static ImageCache getInstance() {
		if (cache == null) {
			cache = new ImageCache();
		}
		return cache;

	}

	// 以软引用的方式对一个Image对象的实例进行引用并保存该引用
	public void cacheImage(Image im) {
		cleanCache();// 清除垃圾引用
		ImageRef ref = new ImageRef(im, q);
		ImageRefs.put(im.getId(), ref);
	}

	// 依据所指定的ID号,重新获取相应Image对象的实例
	public Image getImage(String id) {
		Image im = null;
		// 缓存中是否有该Image实例的软引用,如果有,从软引用中取得。
		if (ImageRefs.containsKey(id)) {
			ImageRef ref = (ImageRef) ImageRefs.get(id);
			im = (Image) ref.get();
		}

		// 如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,
		// 并保存对这个新建实例的软引用

		if (im == null) {
			im = new Image(id);
			System.out.println("Retrieve From ImageInfoCenter. ID=" + id);
			this.cacheImage(im);
		}
		return im;
	}

	private void cleanCache() {
		ImageRef ref = null;
		while ((ref = (ImageRef) q.poll()) != null) {
			ImageRefs.remove(ref.key);
		}
	}

	// 清除Cache内的全部内容

	public void clearCache() {
		cleanCache();
		ImageRefs.clear();
		System.gc();
		System.runFinalization();
	}
}

图片缓存工具类