1. 基本概念
- LRU是计算机科学经常使用的一种近期最少使用算法。
2. 核心思想
- 当缓存满时,会优先淘汰那些近期最少使用的缓存对象。
3. 具体原理
- LruCache是一个泛型类,它内部采用的是一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,当缓存满时,LruCache会移除较早使用的缓存对象,然后再添加新的缓存对象。
4. 三种对象引用区别
- 强引用:直接的对象引用。
- 软引用:当一个对象只有软引用存在时,系统内存不足时次对象会被gc回收。
- 弱引用:当一个对象只有弱引用时存在时,此对象会随时被gc回收。
5. 注意问题
- 内存缓存使用的手机分配给应用的内存,所以要根据系统动态调整大小。
- 注意版本适配,用V4包中的LruCache。
6. 代码实现
public class MyImageLoader {
private LruCache<String, Bitmap> mLruCache;
//用来初始化缓存对象
private MyImageLoader() {
//获取最大可用的内存空间
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
mLruCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
};
}
public static MyImageLoader getInstance() {
return SingletonHolder.sMyImageLoader;
}
private static class SingletonHolder {
private static final MyImageLoader sMyImageLoader = new MyImageLoader();
}
//用来加载网络图片
public void displayImage(ImageView view, String url) {
Bitmap bitmap = getBitmapFromCache(url);
if (bitmap != null) {
view.setImageBitmap(bitmap);
} else {
downloadImage(view,url);
}
}
//从缓存中读取图片
private Bitmap getBitmapFromCache(String url) {
return mLruCache.get(url);
}
//将下载下来的图片保存到缓存中
private void putBitmapToCache(Bitmap bitmap, String url) {
if (bitmap != null) {
mLruCache.put(url, bitmap);
}
}
//下载图片,并添加到缓存中去
private void downloadImage(View view, String url) {
// TODO 进行下载图片的操作
}
}
说明:
- 初始化LruCache只需要提供缓存的总容量大小并重写sizeOf方法即可。
- sizeOf 方法的作用时计算缓存对象的大小,这里大小的单位需要和总容量的单位一致。总容量大小是当前进程的可用内存的1/8,单位为KB,而sizeOf方法完成了Bitmap对象的大小计算。很明显,之所以除以1024也是为了将其单位转换为KB.
- 特殊情况下,还需要重写entryRemoved方法,LruCache移除旧缓存时会调用entryRemoved方法,因此可以在entryRemoved中完成一些资源回收工作。
网友评论