Android 第三方框架UniversalImageLoader解析

 

MemeryCache
Bitmap引用进行缓存
DiskCache
对文件进行缓存
内存缓存其实就是利用Map接口的对象在内存中进行缓存,可能有不同的存储机制。磁盘缓存其实就是将文件写入磁盘
强引用是指创建一个对象并把这个对象赋给一个引用变量, 强引用有引用变量指向时永远不会被垃圾回收。即使内存不足的时候宁愿报OOM也不被垃圾回收器回收,我们new的对象都是强引用
弱引用通过weakReference类来实现,它具有很强的不确定性,如果垃圾回收器扫描到有着WeakReference的对象,就会将其回收释放内存

 

 

需要关注的类:

 MemotyCache(Interface for memory cache)

 MemoryCacheAware

 BaseMemory Cache( Stores not strong references to objects )

 LimitMemory Cache(This cache uses strong and weak references for stored Bitmaps. Strong references - for limited count of * Bitmaps (depends on cache size), weak references - for all other cached Bitmaps.)

 

 

 

 

UIL中的内存缓存策略
1. 只使用的是强引用缓存 
LruMemoryCache(缓存的是bitmap的强引用)
 2.使用强引用和弱引用相结合的缓存有
 UsingFreqLimitedMemoryCache(如果缓存的图片总量超过限定值,先删除使用频率最小(不是最近最少使用)的bitmap
LRULimitedMemoryCache(这个也是使用的lru算法,和LruMemoryCache不同的是,他缓存的是bitmap的弱引用,超过限定值,删除第一个)
FIFOLimitedMemoryCache(先进先出的缓存策略,当超过设定值,先删除最先加入缓存的bitmap
LargestLimitedMemoryCache(当超过缓存限定值,先删除最大的bitmap对象)
LimitedAgeMemoryCache(当 bitmap加入缓存中的时间超过我们设定的值,将其删除)
FuzzyKeyMemoryCache(如果缓存图片的key值与先前缓存key值相同,则删除之前缓存图片)
 3.只使用弱引用缓存
 WeakMemoryCache(这个类缓存bitmap的总大小没有限制,唯一不足的地方就是不稳定,缓存的图片容易被回收掉)

 

 

 

LruMemoryCache:一种使用强引用来保存有数量限制的Bitmapcache(在空间有限的情况,保留最近使用过的Bitmap)。每次 Bitmap被访问时,它就被移动到一个队列的头部。当Bitmap被添加到一个空间已满的cache时,在队列末尾的Bitmap会被挤出去并变成适合 被GC回收的状态。
LinkedHashMap中的get()方法不仅返回所匹配的值,并且在返回前还会将所匹配的key对应的entry调整在列表中的顺序 (LinkedHashMap使用双链表来保存数据),让它处于列表的最后。当然,这种情况必须是在LinkedHashMapaccessOrder==true的情况下才生效的,反之就是get()方法不会改变被匹配的key对应的entry在列表中的位置。
trimToSize(maxSize),trimToSize(...)这个函数就是用来限LruMemoryCache的大小不要超过用户限定的大小,cache的大小由用户在LruMemoryCache刚开始初始化的时候限定,仅需一次遍历。

 

UIL中的默认配置缓存策略。
ImageLoaderConfiguration config = ImageLoaderConfiguration.createDefault(context);
ImageLoaderConfiguration.createDefault(…)这个方法最后是调用Builder.build()方法创建默认的配置参数的。默认的内存缓存实现是LruMemoryCache,磁盘缓存是UnlimitedDiscCache

 

 

 

 

 

 

 

posted @ 2015-07-29 14:00  mall  阅读(156)  评论(0编辑  收藏  举报