63. imageloader源代码分析——内存缓存算法

  

一。前言

  

图片内存缓存可以提高图片显示速度,但是有些问题,比如占用内存,如果不加以控制,甚至可能会伯父

  

所以,需要提供各种各样的算法来控制内存的使用,以适应不同的使用场景,目前,ImageLoader提供了若干内存管理算法。

  

<强>默认内存缓存是关闭的,需要手动打开

  

二。继承关系图

  

 63. 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.Entry

63. imageloader源代码分析——内存缓存算法