Android用LruCache来取代原来强引用和软引用实现内存缓存,因为据说自2.3以后Android将更频繁的调用GC,导致软引用缓存的数据极易被释放。

 

LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用。如果添加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。他的主要原理在trimToSize方法中。需要了解两个主要的变量size和maxSize

maxSize是通过构造方法初始化的值,他表示这个缓存能缓存的最大值是多少。

size在添加和移除缓存都被更新值,他通过safeSizeOf这个方法更新值。safeSizeOf默认返回1,但一般我们会根据maxSize重写这个方法,比如认为maxSize代表是KB的话,那么就以KB为单位返回该项所占的内存大小。

    public void trimToSize(int maxSize) {        while (true) {            K key;            V value;            synchronized (this) {                if (size < 0 || (map.isEmpty() && size != 0)) {                    throw new IllegalStateException(getClass().getName()                            + ".sizeOf() is reporting inconsistent results!");                }                if (size <= maxSize) {                    break;                }                Map.Entry toEvict = map.eldest();                if (toEvict == null) {                    break;                }                key = toEvict.getKey();                value = toEvict.getValue();                map.remove(key);                size -= safeSizeOf(key, value);                evictionCount++;            }            entryRemoved(true, key, value, null);        }}

除异常外首先会判断size是否超过maxSize,,如果超过了就取出最先插入的缓存,如果不为空就删掉(一般来说只要map不为空都不会返回null,因为他是个双休链表),并把size减去该项所占的大小。这个操作将一直循环下去,直到size比maxSize小或者缓存为空。


更多相关文章

  1. Android(安卓)JNI 动态注册方法(JNI_OnLoad)
  2. Android网络编程之通过Post传递参数
  3. android interview 2
  4. 完美解决Android中,ScrollView嵌套ListView的冲突。
  5. Android基于Pull方式解析xml的方法详解
  6. android 开发如何获得第三方应用Widget的包名和类名
  7. Android心得4.1--文件的保存与读取及文件的操作模式详解.doc
  8. 安装android studio报错Failed to install Intel HAXM的解决方法
  9. Android(安卓)通知栏Notification的整合 全面学习

随机推荐

  1. android sqlite遇到的一个吐血的问题
  2. Android退出应用的方法总结
  3. Android开发之核心特性SearchView的开发
  4. android linux(centos6) gradle环境配置
  5. 正确认识android内存管理原理
  6. android studio的安装与环境配置
  7. [置顶] Android-x86入门之--让你的Androi
  8. Android内存机制分析——堆和栈
  9. 如何构建Android(安卓)1.5 Linux内核映像
  10. Android中创建与几种解析xml的方法