LruCache-实现内存缓存的优秀算法

LruCache-实现内存缓存的优秀算法_第1张图片

1. 基本概念

  • LRU是计算机科学经常使用的一种近期最少使用算法。

2. 核心思想

  • 当缓存满时,会优先淘汰那些近期最少使用的缓存对象。

3. 具体原理

  • LruCache是一个泛型类,它内部采用的是一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,当缓存满时,LruCache会移除较早使用的缓存对象,然后再添加新的缓存对象。

4. 三种对象引用区别

  • 强引用:直接的对象引用。
  • 软引用:当一个对象只有软引用存在时,系统内存不足时次对象会被gc回收。
  • 弱引用:当一个对象只有弱引用时存在时,此对象会随时被gc回收。

5. 注意问题

  • 内存缓存使用的手机分配给应用的内存,所以要根据系统动态调整大小。
  • 注意版本适配,用V4包中的LruCache。

6. 代码实现

public class MyImageLoader {

    private LruCache mLruCache;

    //用来初始化缓存对象
    private MyImageLoader() {
        //获取最大可用的内存空间
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        int cacheSize = maxMemory / 8;
        mLruCache = new LruCache(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中完成一些资源回收工作。

你可能感兴趣的:(图片处理,Lrucache)