直接上代码:
public class BitmapCache {
private LruCache<String, Bitmap> lc;//强引用
private HashMap<String, SoftReference<Bitmap>> smap;//弱引用
public BitmapCache() {
smap=new HashMap<String, SoftReference<Bitmap>>();
//取内存的八分之一作为强引用缓存空间
lc=new MyLruCache((int)(Runtime.getRuntime().maxMemory()/8));
}
//将图片存入缓存,以图片的下载地址作为图片获取的键
public void setImage(String url,Bitmap result){
lc.put(url, result);
}
//从缓存里取图片,以图片的下载地址作为键,获取相应图片
public Bitmap getImage (String url){
Bitmap result;
result = lc.get(url);
if (result == null) {
//强引用中没有图片,去弱引用中获取
SoftReference<Bitmap> so = smap.get(url);
if (so != null) {
result = so.get();
return result;
}
} else {
return result;
}
return null;
}
//自定义强引用类,当强引用中的图片被移除时,将移除的图片添加到弱引用中
class MyLruCache extends LruCache<String, Bitmap>{
public MyLruCache(int maxSize) {
super(maxSize);
}
@Override
protected int sizeOf(String key, Bitmap value) {
//调用getByteCount()方法,API最小在12以上
return value.getByteCount();
}
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
smap.put(key, new SoftReference<Bitmap>(oldValue));
}
}
}
该类的使用很简单,实例化该类,
通过该类的setImage方法存储下载的图片,通过该类的getImage 方法获取缓存中的图片。