全面解析Android的开源图片框架Universal-Image-Loader

2019-12-10 18:34:04丽君

在构造方法中,第69行有一个方法calculateCacheSizeAndFillUsageMap(),该方法是计算cacheDir的文件大小,并将文件和文件的最后修改时间加入到Map中
然后是将文件加入硬盘缓存的方法put(),在106行判断当前文件的缓存总数加上即将要加入缓存的文件大小是否超过缓存设定值,如果超过了执行removeNext()方法,接下来就来看看这个方法的具体实现,150-167中找出最先加入硬盘的文件,169-180中将其从文件硬盘中删除,并返回该文件的大小,删除成功之后成员变量cacheSize需要减掉改文件大小。
FileCountLimitedDiscCache这个类实现逻辑跟TotalSizeLimitedDiscCache是一样的,区别在于getSize()方法,前者返回1,表示为文件数是1,后者返回文件的大小。
等我写完了这篇文章,我才发现FileCountLimitedDiscCache和TotalSizeLimitedDiscCache在最新的源码中已经删除了,加入了LruDiscCache,由于我的是之前的源码,所以我也不改了,大家如果想要了解LruDiscCache可以去看最新的源码,我这里就不介绍了,还好内存缓存的没变化,下面分析的是最新的源码中的部分,我们在使用中可以不自行配置硬盘缓存策略,直接用DefaultConfigurationFactory中的就行了
我们看DefaultConfigurationFactory这个类的createDiskCache()方法

/** 
 * Creates default implementation of {@link DiskCache} depends on incoming parameters 
 */ 
public static DiskCache createDiskCache(Context context, FileNameGenerator diskCacheFileNameGenerator, 
  long diskCacheSize, int diskCacheFileCount) { 
 File reserveCacheDir = createReserveDiskCacheDir(context); 
 if (diskCacheSize > 0 || diskCacheFileCount > 0) { 
  File individualCacheDir = StorageUtils.getIndividualCacheDirectory(context); 
  LruDiscCache diskCache = new LruDiscCache(individualCacheDir, diskCacheFileNameGenerator, diskCacheSize, 
    diskCacheFileCount); 
  diskCache.setReserveCacheDir(reserveCacheDir); 
  return diskCache; 
 } else { 
  File cacheDir = StorageUtils.getCacheDirectory(context); 
  return new UnlimitedDiscCache(cacheDir, reserveCacheDir, diskCacheFileNameGenerator); 
 } 
} 

如果我们在ImageLoaderConfiguration中配置了diskCacheSize和diskCacheFileCount,他就使用的是LruDiscCache,否则使用的是UnlimitedDiscCache,在最新的源码中还有一个硬盘缓存类可以配置,那就是LimitedAgeDiscCache,可以在ImageLoaderConfiguration.diskCache(...)配置。