LruCache缓存分析及使用

来源:互联网 发布:巡音露卡的事件簿知乎 编辑:程序博客网 时间:2024/05/26 05:51

LruCache缓存分析及使用

内部实现原理:LinkedHashMap作为一个链表结构,在new LinkedHashMap<>(0,0.75f,true)时传入的第三个参数若为true(若为false则按照插入LinkedHashMap 的顺序进行排列)便可以将多次有过操作(put或是get)LinkedHashMap的键值对链接在LinkedHashMap的末端,对于之前的元素(即该键值对之前的键值对)进行裁剪判断(从LinkedHashMap的初始位置进行遍历做回收判断),在超过给定的内存大小或键值对的数量的条件限制下对其进行删除回收操作,已达到删除回收最近最少使用的元素的目的。

具体的步骤可以参看源码,注意sizeof方法如果不重写,则返回1,就是键值对的数量了。所以在使用中一般会像如下一样重写:

//获取系统分配给每个应用程序的最大内存int maxMemory = (int) Runtime.getRuntime().maxMemory();   //取缓存大小,一般是总内存的1/8int mCacheSize = maxMemory / 8;  LruCache<String, Bitmap> mLruCache= new LruCache<String, Bitmap>(mCacheSize){      //重写此方法,来测量Bitmap的大小      @Override      protected int sizeOf(String key, Bitmap value) {          return value.getRowBytes() * value.getHeight();      }     };//添加Bitmap到内存缓存 mLruCache.put(key, bitmap); //put进入的时候会返回当前键的旧值//从内存缓存中获取一个BitmapBitmap bitmap = mLruCache.get(key); //get 键key对应的Bitmap对象//移除缓存Bitmap bitmap = mLruCache.remove(key);//remove会返回key对应的值//回收已经remove掉的bitmap,以释放内存空间if (bitmap != null)      bitmap.recycle();
原创粉丝点击