一。前言
图片内存缓存可以提高图片显示速度,但是有些问题,比如占用内存,如果不加以控制,甚至可能会伯父
所以,需要提供各种各样的算法来控制内存的使用,以适应不同的使用场景,目前,ImageLoader提供了若干内存管理算法。
<强>默认内存缓存是关闭的,需要手动打开强>
二。继承关系图
三。主要内存算法介绍
算法 解释 MemoryCache 界面内存缓存的接口 MemoryCache 界面内存缓存的接口 FuzzyKeyMemoryCache 模糊关键内存缓存,一些不同的关键可能会被认为是相同(通过=方法)。当你把一个值到缓存里面时,等于相同的关键也会被替换。这是一个内部功能,通常我们不需要使用到它。 LimitedAgeMemoryCache 限制时间内存缓存,如果一些对象的使用时间超过了定义的值,那么就会移除。比如最大时间设置成60年代,那么如果一个对象是60年代前把进的来的,那么它就会失效。 LruMemoryCache 一个强引用的图片,限制图片使用数量的内存缓存,每个被访问的图片都会移动到队列的头部。当一个图片添加到一个满的队列的时候,队尾的图片将会被驱逐而被垃圾回收器回收。 BaseMemoryCache 抽象类,基本的图片缓存管理,提供了图片存储(强引用或者弱引用),具体的可以看下面的MemoryCache实现。 WeakMemoryCache 继承自BaseMemoryCache,弱引用内存缓存,弱引用,当内存不足的时候,会被系统回收。 LimitedMemoryCache 抽象类,继承自BaseMemoryCache,限制内存的内存管理抽象类,包括下面4个具体实现。提供图片对象存储,存储的所有的图片大小将不会超过大小限制。这个缓存提供了强引用和弱引用存储了图片,强引用用来限制图片大小,弱引用用来其他缓存的图片。 FIFOLimitedMemoryCache 继承自LimitedMemoryCache,存储的图片大小不小超过限定的大小。当缓存图片到达指定大小时,会按照FIFO(先进先出)的原则清理图片。 LRULimitedMemoryCache 继承自LimitedMemoryCache,存储的图片大小不小超过限定的大小。当缓存图片到达指定大小时,最早使用的图片会从缓存中删除。 LargestLimitedMemoryCache 继承自LimitedMemoryCache,存储的图片大小不小超过限定的大小。当缓存图片到达指定大小时,最大的图片会从缓存中删除。 UsingFreqLimitedMemoryCache 继承自LimitedMemoryCache,存储的图片大小不小超过限定的大小。当缓存图片到达指定大小时,最少使用频率的图片会从缓存中删除。下面,我们会具体看各个MemoryCache的实现
四。LimitedAgeMemoryCache
<代码>公共类LimitedAgeMemoryCache实现MemoryCache { 私人最终MemoryCache缓存; 私人最终长maxAge; 私人最终Map<字符串,Long>loadingDates=集合。synchronizedMap(新HashMap<字符串,Long> ()); @Override 公共布尔把字符串键,位图值){ 布尔putSuccesfully=缓存。put(关键字,值); 如果(putSuccesfully) { loadingDates。把(关键,System.currentTimeMillis ()); } 返回putSuccesfully; } @Override 公共位图(String键){ 长loadingDate=loadingDates.get(关键); 如果(loadingDate !=零,,System.currentTimeMillis ()——loadingDate祝辞maxAge) { cache.remove(关键); loadingDates.remove(关键); } 返回cache.get(关键); } }代码>
实现的方法很简单,在放的时候,用一个地图记录了存入的时间,得到的时候,判断时间是否大于maxAge,如果是,那么就删掉这个缓存。
五。LruMemoryCache
<代码>公共类LruMemoryCache实现MemoryCache { 私人最终LinkedHashMap<字符串,Bitmap>地图; 私人最终int最大容量; @Override 公众最终布尔把(字符串键,位图值){ … 同步(){ 大小+=运算符(关键字,值); 位图之前=地图。put(关键字,值); 如果(先前!=null) { 大小-=运算符(关键,之前); } } trimToSize(最大尺寸); 返回true; } 私人空间trimToSize (int最大尺寸){ 而(真){ 字符串键; 位图值; 同步(){ 如果(大小& lt;0 | | (map.isEmpty (),,大小!=0)){ 把新IllegalStateException (getClass () . getname () +“.sizeOf()报告不一致的结果! "); } 如果(大小& lt;=最大容量| | map.isEmpty ()) { 打破; } Bitmap> Map.Entry63. imageloader源代码分析——内存缓存算法