volley2----------内存缓存和LruCache

来源:互联网 发布:兵营升级数据 率土之滨 编辑:程序博客网 时间:2024/05/21 10:10

内存缓存

  • 1.内存缓存的核心:
    • 存:就有很多的考虑
    • 取:只需要知道唯一的key就可以了
  • 2.选择什么样的存储结构/容器/集合?Map<String,Bitmap>
  • 3.4种引用级别什么意思?
    • 强引用:我们平时使用的集合(arraylist,hashmap,hashset),即使内存oom,也不会去回收对象;
    • 软应用:使用SoftRefrence去包装一个对象,内存不足的时候去回收对象,尽量保证不oom
    • 弱应用:基本没有用过
    • 虚引用:形同虚设,同样没有用过
  • 4.删除策略/算法,
  • 我们定义的存储结构,不能继续缓存图片的时候.需要进行清理   
    • LRU:最近最少使用,Least Recently Used,其实就是按照访问顺序排序
    • 删除使用次数最少的:
    • 删除占用体积最大:

  • 5. 在很久之前(2,3年)前做图片的缓存基本都是使用软应用,但是在2.3之后.google文档明确指出了软应用做缓存的一些不足.建议我们使用LruCache.class;

  • 6.举例说明删除策略的使用场景
    • LRU:电影海报图删除策略-->和时间有关系(时效性)   
    • 删除使用次数最少的:-->和时间没有关系而且大小差不多 
    • 比如办公软件的使用  就是给对象计数 然后最后去计算排序 去把最少进行移除掉
    • 删除占用体积最大:空间比较宝贵的情况



LruCache的使用:

一个工具方法,提供了基于Lru缓存策略强引用的内存缓存,存储结构使用的LinkedHashmap

  • LinkedHashmap使用

    • LinkedHashmap和Hashmap区别:在构造方法里面多了3个参数
    • 3个参数的意义:
      • initialCapacity:初始化容器大小 16
      • loadFactor:负载因子
      • accessOrder:
        • true:LinkedHash内部会排序-->按照访问顺序排序-->这个也是为什么LruCache使用LinkedHashmap做存储结构的原因
        • false:按照插入顺序去排序
  • LruCache在什么地方可以找到?

    • 在高版本的sdk里面有.
    • 在v4包中有提供.
    • LruCache的使用

      1. 告知缓存的具体大小
      2. 覆写sizeOf方法,具体大小需要和我们定义的maxsize单位统一
      3. maxsize需要和sizeof返回的单位一样 都是byte:

           long  max=Runtime.getRuntime().maxMemory()/1024/1024;   int size=(int) (max/8);   LinkedHashMap<K, V>  底层内置的就是一个 双向链表    lru = new LruCache<String, Bitmap>(size){        从写这个方法  size的变化        @Override        protected int sizeOf(String key, Bitmap value) {      从写方法来衡量每一张图片的大小 默认返回的是图片数量   超过的话会 移除队列的内容            return value.getByteCount() ;        }    };
0 0