DiskCache

DiskCache.java
图片的磁盘缓存接口。

BaseDiskCache.java
一个无大小限制的本地图片缓存,实现了DiskCache主要函数的抽象类。
图片缓存在cacheDir文件夹内,当cacheDir不可用时,则使用备库reserveCacheDir
主要函数:
(1). save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener)
先根据imageUri得到目标文件,将imageStream先写入与目标文件同一文件夹的 .tmp 结尾的临时文件内,若未被listener取消且写入成功则将临时文件重命名为目标文件并返回 true,否则删除临时文件并返回 false。
(2). save(String imageUri, Bitmap bitmap)
先根据imageUri得到目标文件,通过Bitmap.compress(…)函数将bitmap先写入与目标文件同一文件夹的 .tmp 结尾的临时文件内,若写入成功则将临时文件重命名为目标文件并返回 true,否则删除临时文件并返回 false。
(3). File getFile(String imageUri)
根据 imageUri 和 fileNameGenerator得到文件名,返回cacheDir内该文件,若cacheDir不可用,则使用备库reserveCacheDir。

LimitedAgeDiskCache.java
限制了缓存对象最长存活周期的磁盘缓存,继承自BaseDiskCache。
在 get(…) 时判断如果缓存对象存活时间已经超过设置的最长时间,则删除。在 save(…) 时保存当存时间作为对象的创建时间。

UnlimitedDiskCache.java
一个无大小限制的本地图片缓存。与BaseDiskCache无异,只是用了个意思明确的类名。

DiskLruCache.java
限制总字节大小的内存缓存,会在缓存满时优先删除最近最少使用的元素。
通过缓存目录下名为journal的文件记录缓存的所有操作,并在缓存open
时读取journal的文件内容存储到LinkedHashMap<String, Entry> lruEntries
中,后面get(String key)获取缓存内容时,会先从lruEntries中得到图片文件名返回文件。
LRU 的实现跟上面内存缓存类似,lruEntries
为new LinkedHashMap<String, Entry>(0, 0.75f, true),LinkedHashMap 第三个参数表示是否需要根据访问顺序(accessOrder)排序,true 表示根据accessOrder排序,最近访问的跟最新加入的一样放到最后面,false 表示根据插入顺序排序。这里为 true 且缓存满时trimToSize()函数始终删除第一个元素,即始终删除最近最少访问的文件。
来源于 JakeWharton 的开源项目 DiskLruCache,具体分析请等待 DiskLruCache 源码解析 完成

LruDiskCache.java
限制总字节大小的内存缓存,会在缓存满时优先删除最近最少使用的元素,实现了DiskCache。
内部有个DiskLruCache cache属性,缓存的存、取操作基本都是由该属性代理完成

StrictLineReader.java
通过readLine()函数从InputStream中读取一行,目前仅用于磁盘缓存操作记录文件journal的解析

FileNameGenerator.java
根据 uri 得到文件名的接口

HashCodeFileNameGenerator.java
以 uri 的 hashCode 作为文件名

Md5FileNameGenerator.java
以 uri 的 MD5 值作为文件名

DiskCache.java
图片的磁盘缓存接口

推荐阅读更多精彩内容