DiskLruCache简介

QuibblerQuibbler 2020-04-26 约 8 分钟 1786 次阅读

DiskLruCache简介

Android开发中经常用到三级缓存:内存缓存、硬盘缓存、网络缓存。速度也是由快到慢。内存缓存用到的是LruCache,这里来介绍一下硬盘缓存DiskLruCache。

GitHub:DiskLruCache

APIDoc:DiskLruCache

1、添加依赖

DiskLruCache不是Android官方的工具类,是由大神JakeWharton写的。该库已经归档,不再维护。

implementation 'com.jakewharton:disklrucache:2.0.2'

2、需要权限

因为是硬盘缓存,所以一定要有存储的读写权限。在AndroidManifest中声明相应的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3、使用DiskLruCache

DiskLruCache之所以这么风靡,就是因为使用起来简单,优秀的设计值得参考学习。

3.1、开启缓存

获取DiskLruCache很简单,通过open()静态方法打开一个缓存区域。传入指定缓存的目录、缓存版本、每个key对应的缓存数量、缓存区大小。Android各种目录的获取参考Android开发中的各种Directory。

/*
     * directory – 缓存目录
     * appVersion - 缓存版本
     * valueCount – 每个key对应value的个数
     * maxSize – 缓存大小的上限
     */
    DiskLruCache diskLruCache = DiskLruCache.open(directory, 1, 1, 1024 * 1024 * 10);

DiskLruCache用完需要调用close()关闭:

diskLruCache.close();

3.2、添加缓存

向DiskLruCache中添加缓存写入文件。通过key标记不同的缓存记录,key可以通过文件名等信息做MD5加密得到独一无二的值,MD5参考MD5加密。

DiskLruCache.Editor editor = diskLruCache.edit(key);
    // index与valueCount对应,分别为0,1,2...valueCount-1;一般为0
    editor.newOutputStream(0).write( );
    editor.commit();

还支持一次写入多个缓存,借助index给每个需要缓存的文件做记录

DiskLruCache.Editor editor = diskLruCache.edit(key);
    // index与valueCount对应,分别为0,1,2...valueCount-1
    editor.newOutputStream(0).write(...);
    editor.newOutputStream(1).write(...);
    ...
    editor.commit();

3.3、获取缓存

通过缓存时写入的key,获取对应的缓存:

DiskLruCache.Snapshot snapshot = diskLruCache.get(key);
    InputStream inputStream = snapshot.getInputStream(0);
    //读取文件
    ...

同样还可以一次从key中读取写入的多个缓存:

DiskLruCache.Snapshot snapshot = diskLruCache.get("1");
    InputStream inputStream0 = snapshot.getInputStream(0);
    InputStream inputStream1 = snapshot.getInputStream(1);
    //读取文件
    ...

4、常用方法

DiskLruCache中的主要方法如下:

方法备注
DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)打开一个缓存目录,如果没有则首先创建它,directory:指定数据缓存地址 appVersion:APP版本号,当版本号改变时,缓存数据会被清除 valueCount:同一个key可以对应多少文件 maxSize:最大可以缓存的数据量
Editor edit(String key)通过key可以获得一个DiskLruCache.Editor,通过Editor可以得到一个输出流,进而缓存到本地存储上
void flush()强制缓冲文件保存到文件系统
Snapshot get(String key)通过key值来获得一个Snapshot,如果Snapshot存在,则移动到LRU队列的头部来,通过Snapshot可以得到一个输入流InputStream
long size()缓存数据的大小,单位是byte
boolean remove(String key)根据key值来删除对应的数据,如果该数据正在被编辑,则不能删除
void delete()关闭缓存并且删除目录下所有的缓存数据,即使有的数据不是由DiskLruCache 缓存到本目录的
void close()关闭DiskLruCache,缓存数据会保留在外存中
boolean isClosed()判断DiskLruCache是否关闭,返回true表示已关闭
File getDirectory()缓存数据的目录

5、源码解析

详见。

相关博客:

        DiskLruCache的基本用法

        Android使用磁盘缓存DiskLruCache

        DiskLruCache缓存机制

        Android图片三级缓存机制

        Android使用磁盘缓存DiskLruCache

        DiskLruCache的基本用法

        使用 DiskLruCache 缓存bitmap

        

相关推荐

精选
Airbnb开源项目
开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

1.8k
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.2k
优美的开源动效库:Lottie
开源

优美的开源动效库:Lottie

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

4.3k