内存缓存
- 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的使用
-
- 告知缓存的具体大小
- 覆写sizeOf方法,具体大小需要和我们定义的maxsize单位统一
-
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() ; } };