Universal-Image-Loader源码阅读(24)-LimitedAgeDiskCache

来源:互联网 发布:手机怎么注册淘宝网 编辑:程序博客网 时间:2024/06/17 15:08

有时间限制的硬件缓存。

增加了文件存在的最长时间,超过时间了则删除。

但是存储空间的额大小没有限制。

源码

/** * Cache which deletes files which were loaded more than defined time. Cache size is unlimited. * * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) * @since 1.3.1 */public class LimitedAgeDiskCache extends BaseDiskCache {private final long maxFileAge;private final Map<File, Long> loadingDates = Collections.synchronizedMap(new HashMap<File, Long>());/** * @param cacheDir Directory for file caching * @param maxAge   Max file age (in seconds). If file age will exceed this value then it'll be removed on next *                 treatment (and therefore be reloaded). */public LimitedAgeDiskCache(File cacheDir, long maxAge) {this(cacheDir, null, DefaultConfigurationFactory.createFileNameGenerator(), maxAge);}/** * @param cacheDir Directory for file caching * @param maxAge   Max file age (in seconds). If file age will exceed this value then it'll be removed on next *                 treatment (and therefore be reloaded). */public LimitedAgeDiskCache(File cacheDir, File reserveCacheDir, long maxAge) {this(cacheDir, reserveCacheDir, DefaultConfigurationFactory.createFileNameGenerator(), maxAge);}/** * @param cacheDir          Directory for file caching * @param reserveCacheDir   null-ok; Reserve directory for file caching. It's used when the primary directory isn't available. * @param fileNameGenerator Name generator for cached files * @param maxAge            Max file age (in seconds). If file age will exceed this value then it'll be removed on next *                          treatment (and therefore be reloaded). */public LimitedAgeDiskCache(File cacheDir, File reserveCacheDir, FileNameGenerator fileNameGenerator, long maxAge) {super(cacheDir, reserveCacheDir, fileNameGenerator);this.maxFileAge = maxAge * 1000; // to milliseconds}@Overridepublic File get(String imageUri) {//如果发现文件超时了,则删除File file = super.get(imageUri);if (file != null && file.exists()) {boolean cached;Long loadingDate = loadingDates.get(file);if (loadingDate == null) {cached = false;loadingDate = file.lastModified();} else {cached = true;}if (System.currentTimeMillis() - loadingDate > maxFileAge) {file.delete();loadingDates.remove(file);} else if (!cached) {loadingDates.put(file, loadingDate);}}return file;}@Overridepublic boolean save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener) throws IOException {boolean saved = super.save(imageUri, imageStream, listener);rememberUsage(imageUri);return saved;}@Overridepublic boolean save(String imageUri, Bitmap bitmap) throws IOException {boolean saved = super.save(imageUri, bitmap);rememberUsage(imageUri);return saved;}@Overridepublic boolean remove(String imageUri) {loadingDates.remove(getFile(imageUri));return super.remove(imageUri);}@Overridepublic void clear() {super.clear();loadingDates.clear();}private void rememberUsage(String imageUri) {//更新文件最新访问时间File file = getFile(imageUri);long currentTime = System.currentTimeMillis();file.setLastModified(currentTime);loadingDates.put(file, currentTime);}}

0 0