在我们的移动设备中实现缓存是一个很重要的功能,今天我们了解一下内存缓存LruCache,LruCache是一个泛型类,提供了get和set方法来完成缓存的获取和添加操作,当缓存满时会移除近期使用最少的缓存对象(ps:lrucache只是把该对象从缓存中移出),然后再添加进新的缓存对象。它内部采用了一个LinkedHashMap以强引用的方式存储外界的缓存对象。这里区别一下强引用、软引用和弱引用:
强引用:直接的对象引用;
软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被回收;
弱引用:当一个对象只有弱引用时,系统会随时回收此对象。
这里我们简单的实现一个图片缓存类:
publicclass ImageCache {
private LruCache<String,Bitmap>memoryCache;
private int maxMemory;
private int cacheSize;
public ImageCache(){
maxMemory= (int)(Runtime.getRuntime().maxMemory()/1024);
cacheSize=maxMemory/8;
memoryCache=new LruCache<String,Bitmap>(cacheSize){
@Override
protected int sizeOf(String key,Bitmap bitmap) {
returnbitmap.getRowBytes()*bitmap.getHeight()/1024;
}
};
}
/**
*
* @param key
* @param bitmap
*/
public void putBitmap(String key,Bitmapbitmap){
memoryCache.put(key,bitmap);
}
/**
*
* @param key
* @return
*/
public Bitmap getBitmap(String key){
if(null==memoryCache.get(key)){
return memoryCache.get(key);
}
return null;
}
/**
*
*@param key
*@return
*/
public Bitmapremove(String key){
return memoryCache.remove(key);
}
}
这里我们首先获取到当前进程的最大可用内存maxMemory,并将最大缓存容量cacheSize设置为最大可用内存的1/8,然后我们实例化LruCache时只需要指定缓存空间的大小并重写sizeOf方法,该方法是用来计算缓存对象的大小,这里的单位必须和总容量的单位一致。
LruCache的源码也比较的少:我们来一起看一下源码
首先是构造方法:
这里会将我们传入的缓存大小设置给maxSize并将this.map变量实例化,我们的缓存对象就是放置在该对象中。
我们再来看我们实例化LruCache对象时重写的sizeOf方法:
可以看出默认此方法返回的对象大小是1,显示如果我们不重写该方法是不行滴。
接下来我们可以看到put和get方法分别用于添加缓存对象和根据key来取缓存。
此外LruCache还提供了remove方法来根据key移除对应的缓存对象:
当然,LruCache源码中还有一些其它方法就不和大家一一的看了。大家可以自行看一下源码。