Android ImageLoader 本地缓存
本地缓存
在缓存文件时对文件名的改动提供了两种方式,每一种方式相应了一个Java类
1) HashCodeFileNameGenerator,该类负责获取文件名的hashcode然后转换成字符串。
2) Md5FileNameGenerator,该类把源文件的名称同过md5加密后保存。
两个类都继承了FileNameGenerator接口
在DefaultConfigurationFactory类中提供了一个工厂方法createFileNameGenerator,该方法返回了一个默认的FileNameGenerator对象:HashCodeFileNameGenerator.
public static FileNameGenerator createFileNameGenerator() { return new HashCodeFileNameGenerator(); }实现
首先定义了DiscCacheAware接口,该接口提供了例如以下方法
File getFileDectory() 返回磁盘缓存的根文件夹 File get(String imageUri) 依据uri从缓存中获取图片 boolean save(String imageUri,InputStream iamgeStream,IoUtils.CopyListener listener) 把图片保存在磁盘缓存上 boolean save(String imageUri,Bitmap bitmap) 保存bitmap对象到磁盘缓存上 boolean remove(imageUri) 依据imageUri删除文件 void close() 关闭磁盘缓存,释放资源 void clear() 清空磁盘缓存
然后定义了另外一个没方法的接口DiskCache,该接口仅仅是简单的继承了DiscCacheAware接口。
BaseDiscCache实现了DiskCache,该类是个抽象类,该类定义了磁盘缓冲区的下面的属性:
1) 默认的缓存大小为32k
2) 默认压缩后的图片格式为PNG(作为Bitmap的compress方法的第一个參数)
3) 默认压缩后图片显示的质量为100。也就是压缩率为0。不进行压缩(作为compress的第二个參数)
提供了改动压缩图片格式和压缩率以及改动缓存大小的set方法。
同一时候该类还封装了下面三个属性
protected final File cacheDir;//缓存文件的保存Directory protected final File reserveCacheDir;//后备缓存的Diectory,当cacheDir不存在的情况下就是用reserveCahceDir后备缓存 protected final FileNameGenerator fileNameGenerator;//文件名称名称生成器
构造函数
public BaseDiscCache(File cacheDir) { this(cacheDir, null); } public BaseDiscCache(File cacheDir, File reserveCacheDir) { this(cacheDir, reserveCacheDir, DefaultConfigurationFactory.createFileNameGenerator()); } public BaseDiscCache(File cacheDir, File reserveCacheDir, FileNameGenerator fileNameGenerator) { if (cacheDir == null) { throw new IllegalArgumentException('cacheDir' + ERROR_ARG_NULL); } if (fileNameGenerator == null) { throw new IllegalArgumentException('fileNameGenerator' + ERROR_ARG_NULL); } this.cacheDir = cacheDir; this.reserveCacheDir = reserveCacheDir; this.fileNameGenerator = fileNameGenerator; }1) 仅仅有一个參数的构造函数仅仅初始化了cacheDir,没实用到后备缓存,且是以HashCodeFileNameGenerator来生成目标文件的文件名称。
2) 两个參数的构造器除了cacheDir和HashCodefileNameGenerator外,也能够初始化后备缓存
3) 三个參数的构造器要求必须初始化cacheDir而且必须初始化filenNameGenerator否则就报异常
get(String imageUri)
protected File getFile(String imageUri) { String fileName = fileNameGenerator.generate(imageUri); File dir = cacheDir; if (!cacheDir.exists() && !cacheDir.mkdirs()) { if (reserveCacheDir != null && (reserveCacheDir.exists() || reserveCacheDir.mkdirs())) { dir = reserveCacheDir; } } return new File(dir, fileName); }
save(String imageUri, Bitmap bitmap)
public boolean save(String imageUri, Bitmap bitmap) throws IOException { //获取imageUri的File对象。该对象封装了缓存路径和图片保存后的名称 File imageFile = getFile(imageUri); //获取暂时保存文件的tmpFile对象 File tmpFile = new File(imageFile.getAbsolutePath() + TEMP_IMAGE_POSTFIX); OutputStream os = new BufferedOutputStream(new FileOutputStream(tmpFile), bufferSize); boolean savedSuccessfully = false; try { //调用compress把bitMap压缩到tempFile中 savedSuccessfully = bitmap.compress(compressFormat, compressQuality, os); } finally { IoUtils.closeSilently(os); //假设保存成功而且tempFile的文件没有成功移动到imageFile的话,就删除temFile if (savedSuccessfully && !tmpFile.renameTo(imageFile)) { savedSuccessfully = false; } if (!savedSuccessfully) { tmpFile.delete(); } } //对bitmap进行垃圾回收 bitmap.recycle(); return savedSuccessfully; }
BaseDiscCache有两个扩展类,一个是不限制缓存大小的UnlimitedDiscCache和限制缓存时间的LimitedAgeDiscCache,当中UnlimitedDiscCache非常easy它仅仅是简单的继承了BaseDiscCache并未对BaseDiscCache做不论什么扩展。
LimitedAgeDiscCache该类实现了在缓存中删除被载入超过规定时间的文件:满足下面条件的时候就从缓存中删除文件:系统当前时间-文件的最新改动时间 > maxFileAge