Android ImageLoader 本地缓存

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) 默认的缓存大小为32k2) 默认压缩后的图片格式为PNG(作为Bitmap的compress方法的第一个参数)3) 默认压缩后图片显示的质量为100,也就是压缩率为0,不进行压缩(作为compress的第二个参数)提供了修改压缩图片格式和压缩率以及修改缓存大小的set方法。同时该类还封装了以下三个属性protected final File cacheDir;//缓存文件的保存Directoryprotected 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的话,就删除temFileif (savedSuccessfully && !tmpFile.renameTo(imageFile)) {savedSuccessfully = false;}if (!savedSuccessfully) {tmpFile.delete();}}//对bitmap进行垃圾回收bitmap.recycle();return savedSuccessfully;}

BaseDiscCache有两个扩展类,一个是不限制缓存大小的UnlimitedDiscCache和限制缓存时间的LimitedAgeDiscCache,其中UnlimitedDiscCache很简单它只是简单的继承了BaseDiscCache并未对BaseDiscCache做任何扩展。

夫妇一条心,泥土变黄金。

Android ImageLoader 本地缓存

相关文章:

你感兴趣的文章:

标签云: