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) 默认的缓存大小为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
LimitedAgeDiscCache &
Android ImageLoader 本地缓存的更多相关文章
- Android -- ImageLoader本地缓存
传送门 <Android -- ImageLoader简析> http://www.cnblogs.com/yydcdut/p/4008097.html 本地缓存 在缓存文件时对文件名称 ...
- RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52585912 本文出自:[余志强的博客] switchIfEmpty ...
- Android 清除本地缓存
主要功能:清除内.外缓存,清除数据库,清除Sharepreference,清除files和清除自定义目录 public class DataCleanManager { //清除本应用内部缓存(/da ...
- android——ImageLoader添加缓存
//给图片加入到缓存中. DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc( ...
- Android清除本地数据缓存代码案例
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除shar ...
- Android远程图片获取和本地缓存
对于客户端——服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对 应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手机流量就用完了,等用户发现是你的应用 ...
- ImageLoader(多线程网络图片加载)+本地缓存 for windowsphone 7
搞了好长一阵子wp,做点好事. C/S手机app中应用最多的是 获取网络图片,缓存到本地,展示图片 本次主要对其中的delay:LowProfileImageLoader进行修改,在获取图片的时候, ...
- Android四大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比
四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用. Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所 ...
- Atitit.播放系统规划新版本 and 最近版本回顾 v3 pbf.doc 1 版本11 (ing)41.1 规划h5本地缓存系列 41.2 Android版本app41.3 双类别系统,
Atitit.播放系统规划新版本 and 最近版本回顾 v3 pbf.doc 1 版本11 (ing)4 1.1 规划h5本地缓存系列 4 1.2 Android版本app4 1.3 双类别系统, ...
随机推荐
- mysql 数据库 show命令
MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1. show tables或show tables fr ...
- mac rar文件解压缩
在下载文件时经常遇到RAR格式的压缩文件, 之前从APP Store下载了免费的解压软件, 但是总觉着不好用, 广告信息很多. 好用的软件都要花钱, 所以找到了命令行解决的办法. 步骤如下: 首先需要 ...
- 树莓派 - RasberryPi推送数据到cloudMQTT
创建用户 在https://www.cloudmqtt.com/上创建一个帐户 转到右上角的控制面板 点击"创建"按钮 安装lib sudo pip install paho-mq ...
- Python 2 和 Python 3 主要区别有哪些(1)
Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷.---摘录自<流畅的Pyt ...
- 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务
Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback:如果发生的异常是checked异常,默认情况下数据库操作还是会 ...
- 如何在ASP.NET MVC为Action定义筛选器
在ASP.NET MVC中,经常会用到[Required]等特性,在MVC中,同样可以为Action自定义筛选器,来描述控制器所遵守的规则. 首先,我们在ASP.NET MVC项目中定义一个TestC ...
- javaweb 开发所需工具和入门教程文档等
下载网址 1.JDK1.8下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
- Leetcode 309.最佳买卖股票时机含冷冻期
最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格. 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不 ...
- POJ 1635 树的最小表示法
题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序 ...
- 洛谷P2870 - [USACO07DEC]最佳牛线Best Cow Line
Portal Description 给出一个字符串\(s(|s|\leq3\times10^4)\),每次从\(s\)的开头或结尾取出一个字符接在新字符串\(s'\)的末尾.求字典序最小的\(s'\ ...