美文网首页
LruCache-实现内存缓存的优秀算法

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

作者: 付凯强 | 来源:发表于2018-03-04 21:43 被阅读0次
    Android.png

    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中完成一些资源回收工作。

    相关文章

      网友评论

          本文标题:LruCache-实现内存缓存的优秀算法

          本文链接:https://www.haomeiwen.com/subject/yiwqfftx.html