DiskLruCache知识点

本文详细介绍了DiskLruCache的概念及其在Android应用中的使用方法,包括如何存储、读取和清除缓存,以及DiskLruCache的主要方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 什么是DiskLruCache?
    DiskLruCache是一种管理数据存储的技术,单从Cache的字面意思也可以理解到,”Cache”,”高速缓存”。大多数APP,例如新闻类APP,在无网络状态下,也可以访问离线数据,这些数据是在有网络情况下,采用DiskLruCache缓存下来的。
  2. 应用程序存储的路径
    通常数据存储的路径:/sdcard/Android/data/包名/cache.使用该路径的好处有两种:
    第一,这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题。
  3. 如何使用DiskLruCache
    下载DiskLruCache源码:https://github.com/JakeWharton/DiskLruCache
    gradle:compile ‘com.jakewharton:disklrucache:2.0.2’。
    打开缓存:DiskLruCache的构造方法:主要传入四个参数,File对象(其中File对象中包含文件路径等信息),app对应版本,Key对应的文件数(基本都是1),maxSize是大小限制。
private DiskLruCache(File directory, int appVersion, int valueCount, long maxSize) {
    this.directory = directory;
    this.appVersion = appVersion;
    this.journalFile = new File(directory, JOURNAL_FILE);
    this.journalFileTmp = new File(directory, JOURNAL_FILE_TEMP);
    this.journalFileBackup = new File(directory, JOURNAL_FILE_BACKUP);
    this.valueCount = valueCount;
    this.maxSize = maxSize;
  }

(1)如何获取一个DiskLruCache

DiskLruCache是不能new出实例的,如果我们要创建一个DiskLruCache的实例,则需要调用它的open()方法.
DiskLruCache.open(directory,appversion,valueCount,maxSize);

(2)DiskLruCache的存储
String key = generateKey(url);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
获取DiskLruCache.editor实例之后,我们可以调用它的newOutputStream()方法来创建一个输出流,然后把它传入到downloadUrlToStream()中就能实现下载并写入缓存的功能了。注意newOutputStream()方法接收一个index参数,由于前面在设置valueCount的时候指定的是1,所以这里index传0就可以了。在写入操作执行完之后,我们还需要调用一下commit()方法进行提交才能使写入生效,调用abort()方法的话则表示放弃此次写入。

try {  
            String imageUrl = "xxxxxx";  
            String key = hashKeyForDisk(imageUrl);  
            DiskLruCache.Editor editor = mDiskLruCache.edit(key);  
            if (editor != null) {  
                OutputStream outputStream = editor.newOutputStream(0);  
                if (downloadUrlToStream(imageUrl, outputStream)) {  
                    editor.commit();  
                } else {  
                    editor.abort();  
                }  
            }  
            mDiskLruCache.flush();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  

缓存成功写入之后,我们进入到应用的缓存目录下面可以看到一个很长的文件名和一个journal文件。

(3)怎么读取缓存
DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key); //key就是保存的文件时的那个key。

try {  
    String imageUrl = "xxxxxx";  
    String key = hashKeyForDisk(imageUrl);  
    DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key);  
    if (snapShot != null) {  
        InputStream is = snapShot.getInputStream(0);  
        Bitmap bitmap = BitmapFactory.decodeStream(is);  
        mImage.setImageBitmap(bitmap);  
    }  
} catch (IOException e) {  
    e.printStackTrace();  
}  

这是我们从本地缓存中加载的,而不是从网络上加载的,即使在你手机没有联网的情况下,这张图片仍然可以显示出来。

(4)怎么清除缓存
使用DiskLruCache.remove(key);
remove()方法中要求传入一个key,然后会删除这个key对应的缓存图片

try {  
    String imageUrl = "xxxxxx";    
    String key = hashKeyForDisk(imageUrl);    
    mDiskLruCache.remove(key);  
} catch (IOException e) {  
    e.printStackTrace();  
} 

(5)其他的方法
flush()方法
该方法用于将内存中的操作记录同步到日志文件(也就是journal文件)当中。这个方法非常重要,因为DiskLruCache能够正常工作的前提就是要依赖于journal文件中的内容。前面在讲解写入缓存操作的时候我有调用过一次这个方法,但其实并不是每次写入缓存都要调用一次flush()方法的,频繁地调用并不会带来任何好处,只会额外增加同步journal文件的时间。比较标准的做法就是在Activity的onPause()方法中去调用一次flush()方法就可以了。

close()方法
这个方法用于将DiskLruCache关闭掉,是和open()方法对应的一个方法。关闭掉了之后就不能再调用DiskLruCache中任何操作缓存数据的方法,通常只应该在Activity的onDestroy()方法中去调用close()方法。

delete()方法
这个方法用于将所有的缓存数据全部删除,比如说网易新闻中的那个手动清理缓存功能,其实只需要调用一下DiskLruCache的delete()方法就可以。

DiskLruCache详解请看:http://blog.youkuaiyun.com/guolin_blog/article/details/28863651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值