首页 > 代码库 > 详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)

详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)

  内存缓存的扩展还是蛮重要的,无论是数据结构还是具体的实现还是值得我们进行细细的品味,下面咱们就一起能品味这里面的趣味吧。

           内存缓存的扩展主要学习下面的几个类:FIFOLimitedMemoryCache、FuzzyKeyMemoryCache、 LargestLimitedMemoryCache、LimitedAgeMemoryCache、LRULimitedMemoryCache、 LruMemoryCache、UsingFreqLimitedMemoryCache以及WeakMemoryCache。

           Ok,首先我们学习LimitedMemoryCache这个类。LimitedMemoryCache是LimitedMemoryCache的子类,其成员变量如下:

[java] view plaincopyprint?技术分享技术分享
  1. private final List<Bitmap> queue = Collections.synchronizedList(new LinkedList<Bitmap>());  

由此可知内存缓存的数据结构是线程安全的队列。

分析其函数,我们知道队列的操作在这里也是可以得到对应的体现。只是创建软引用的方法还是可以观察一下。

[java] view plaincopyprint?技术分享技术分享
  1. @Override  
  2.     protected Reference<Bitmap> createReference(Bitmap value) {  
  3.         return new WeakReference<Bitmap>(value);  
  4.     }  

          接下来,需要分析的第二个类是FuzzyKeyMemoryCache,按照类的注释,这个类是框架内部使用的,它实现了MemoryCache这个接口。当前的类的成员变量如下:

[java] view plaincopyprint?技术分享技术分享
  1. private final MemoryCache cache;  
  2. private final Comparator<String> keyComparator;  


由MemoryCache这个成员变量并且是在当前的构造函数中初始化可知,这个类是个包装器,真正的功能是由cache实现的。

接下来我们要分析的类是LargestLimitedMemoryCache,这个类依旧是LimitedMemoryCache的子类,

其成员变量如下:

[java] view plaincopyprint?技术分享技术分享
  1. private final Map<Bitmap, Integer> valueSizes = Collections.synchronizedMap(new HashMap<Bitmap, Integer>());  

由此可见,当前的缓存的数据结构已经发生了变化,当前已经是HashMap,HashMa的优势在于删除离散的数据的效率高。

重点关注一下其删除对象的方法:

[java] view plaincopyprint?技术分享技术分享
  1. @Override  
  2.     protected Bitmap removeNext() {  
  3.         Integer maxSize = null;  
  4.         Bitmap largestValue = null;  
  5.         Set<Entry<Bitmap, Integer>> entries = valueSizes.entrySet();  
  6.         synchronized (valueSizes) {  
  7.             for (Entry<Bitmap, Integer> entry : entries) {  
  8.                 if (largestValue == null) {  
  9.                     largestValue = entry.getKey();  
  10.                     maxSize = entry.getValue();  
  11.                 } else {  
  12.                     Integer size = entry.getValue();  
  13.                     if (size > maxSize) {  
  14.                         maxSize = size;  
  15.                         largestValue = entry.getKey();  
  16.                     }  
  17.                 }  
  18.             }  
  19.         }  
  20.         valueSizes.remove(largestValue);  
  21.         return largestValue;  
  22.     }  

由此可见,迭代获取最大的图片,并且进行删除。


接下来需要分析的类是LimitedAgeMemoryCache,

继续关注当前的成员变量:

[java] view plaincopyprint?技术分享技术分享
  1. private final MemoryCache cache;  
  2. private final long maxAge;  
  3. private final Map<String, Long> loadingDates = Collections.synchronizedMap(new HashMap<String, Long>());  


可见当前的成员变量loadingDates,当前的是HashMap。

重点关注下面的成员变量

[java] view plaincopyprint?技术分享技术分享
  1. @Override  
  2.     public Bitmap get(String key) {  
  3.         Long loadingDate = loadingDates.get(key);  
  4.         if (loadingDate != null && System.currentTimeMillis() - loadingDate > maxAge) {  
  5.             cache.remove(key);  
  6.             loadingDates.remove(key);  
  7.         }  
  8.   
  9.         return cache.get(key);  
  10.     }  


如果当前的文件已经达到删除的时间,就直接从缓存的数据结构中删除当前的对象。


由于比较多,这一讲就到这里停笔了,后面剩余的几个类将会在后面的文章中讲解。

[java] view plaincopyprint?
    1.  

详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)