package com.wyp.materialqqlite;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import android.graphics.Bitmap;
public class ImageCache {
private ReferenceQueue<Bitmap> m_queRef;
private Map<String, SoftRef> m_mapImage;
private Queue<String> m_queImage;
private int m_nMaxSize = 80;
private int m_nCleanSize = 20;
private class SoftRef extends SoftReference<Bitmap> {
private String m_strKey = "";
public SoftRef(String strKey, Bitmap bmp, ReferenceQueue<Bitmap> queRef) {
super(bmp, queRef);
m_strKey = strKey;
}
}
public ImageCache() {
m_queRef = new ReferenceQueue<Bitmap>();
m_mapImage = new HashMap<String, SoftRef>();
m_queImage = new LinkedList<String>();
}
public int getMaxSize() {
return m_nMaxSize;
}
public void setMaxSize(int nSize) {
m_nMaxSize = nSize;
}
public int getCleanSize() {
return m_nCleanSize;
}
public void setCleanSize(int nSize) {
m_nCleanSize = nSize;
}
public Bitmap get(int nKey) {
return get(String.valueOf(nKey));
}
public Bitmap get(String strKey) {
Bitmap bmp = null;
if (m_mapImage.containsKey(strKey)) {
SoftRef ref = (SoftRef)m_mapImage.get(strKey);
bmp = (Bitmap)ref.get();
}
return bmp;
}
public void put(int nKey, Bitmap bmp) {
put(String.valueOf(nKey), bmp);
}
public void put(String strKey, Bitmap bmp) {
if (null == strKey || strKey.length() <= 0 || null == bmp)
return;
cleanCache();
if (m_mapImage.size() >= m_nMaxSize) {
forceClean(m_nCleanSize);
}
SoftRef ref = new SoftRef(strKey, bmp, m_queRef);
m_mapImage.put(strKey, ref);
m_queImage.offer(strKey);
}
public void clear() {
cleanCache();
m_mapImage.clear();
System.gc();
System.runFinalization();
}
private void cleanCache() {
SoftRef ref = null;
while ((ref = (SoftRef)m_queRef.poll()) != null) {
m_mapImage.remove(ref.m_strKey);
}
}
private void forceClean(int nSize) {
if (nSize >= m_queImage.size()) {
m_queImage.clear();
m_mapImage.clear();
return;
}
for (int i = 0; i < nSize; i++) {
String strKey = m_queImage.poll();
m_mapImage.remove(strKey);
}
}
}