LruCache的原理
1>首先理解LinkedHashMap
理解LinkedHashMap的特性:
二、迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
三、可以重写removeEldestEntry方法返回true值指定插入元素时移除最老的元素。
关于特性使用的方法:
如果removeEldestEntry返回true,那么LinkedHashMap会自动删掉最不常用的那个entry(也就是header线性表最前面的那个)。
这会造成严重的性能问题吗?答案当然是否定的。因为在这儿的链表操作是常量级的。这也是LinkedHashMap/Set在这儿比TreeMap/Set性能更高的原因。
三、
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
二、LinkedHaspMap与LruCache的关联
* 这里就是实现LRU元素过期机制的地方,默认的情况下removeEldestEntry方法只返回false表示元素永远不过期。
if (eldest != header && removeEldestEntry(eldest)) {
remove(eldest.key);
}
......
private static final int MAX_ENTRIES = 100;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
此方法通常不以任何方式修改映射,相反允许映射在其返回值的指引下进行自我修改。如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。
例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。
三、LruCache的简介
自定义ImageLoader
成员变量
1>图片下载的线程池名称
2>图片缓存最大数量
3>图片的KEY缓存
4>图片的缓存
5>图片下载的线程池
6>用于记录图片下载的任务,以便取消
7>图片的总大小
类中的方法
加载图片(load)
异步加载(asyncload)
取消下载(cancel)
从内存中加载[loadFromMemory(String url) ]
从本地设备中加载【loadFromLocal(String url)】
从网络加载图片【loadFormNet(String url)】
从添加到内存 【addDrawableToMemory(String url,Drawable drawable)】
设置给控件图片 【setImageSafe(final ImageView view,final String url,final Drawable drawable)】
//从本地设备中加载
一般对图片进行处理有BitmapFactory.decodeByteArray(data,offset,length),BitmapFactory.decodeFile(pathName),
BitmapFactory.decodeStream(is);上面三个分析源码可知,他们都是在Java层创建byte数组,然后把数据传递给本地代码,
而 BitmapFactory.decodeFileDescriptor();
是把文件描述符传递给本地代码,由本地代码去创建图片
注意:
1》内存不足是会把bitmap的数组回收掉,但我们的bitmap不会被回收,当你再次显示的时候,发现bitmap的数组为空时,将会再次根据文件描述符去加载图片,此时可能由于加载耗时造成界面卡顿,但总比OOM要好很多。
2》本地代码在创建图片时,没有对图片进行校验,所以如果文件不完整,或者根本不是一个图片时,系统也不会报错,仍然会返回一个bitmap,但是这个bitmap是一个纯黑色的bitmap;那我们需要在下载图片的时候,一定要先以一个临时文件下载,等下载完毕了,再对图片进行重命名。
//从内存中加载
从内存中获取到了,需要重新放到内存队列的最后
LUC: 一般缓存算法有两种,第一种是LFU,按使用次数来判断删除优先级,使用次数最少的最先删除;还有
一个就是LRC,按照使用时间来判断删除的优先级,最后使用时间越早的最先删除。
这两种算法的原理请看此文章第一节部分。
案例下载:
http://download.youkuaiyun.com/detail/javamov/9041621