为什么要用DiskLruCache?
离线数据对于依赖网络加载数据的APP来说具有很重要的意义,当无网络或者是网络状况不好时,APP依然具备部分功能是一种很好的用户体验。假设网易新闻这类新闻客户端,数据完全存储在缓存中而不使用DiskLruCache技术存储,那么当客户端被销毁,缓存被释放,意味着再次打开APP将是一片空白。DiskLruCache是Google官方推荐的一套硬盘缓存的API,虽然Android中并没有包含她,但是能得到官方推荐,必然有着过人之处。
将DiskLruCache加入项目
首先我们需要下载DiskLruCache的文件,github。不过如果用的是AndroidStudio的话,只需要在build.gradle中添加如下代码即可:
compile 'com.jakewharton:disklrucache:2.0.2'
接着重新构建gradle文件就可以了。
使用DiskLruCache
1.创建DiskLruCache实例
DiskLruCache是不能直接new的,如果要创建一个DiskLruCache的实例,需要调用它的open()方法。open()方法接收四个参数,第一个参数指定的是数据的缓存地址,第二个参数指定当前应用程序的版本号,第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1,第四个参数指定最多可以缓存多少字节的数据。
那么缓存地址如何获得呢?当然可以直接制定,但是为了用户体验考虑,不建议这么做。一般会放在/sdcard/Android/data//cache 下,因为选择在这个位置有两点好处:第一,这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题。
但是考虑到不是所有的手机都一定会有SD卡,这里还是需要做一下判断。
/**
* 获取缓存目录
*
* @param context
* @param uniqueName 用于区分缓存内容
* @return
*/
private File getDiskCacheDir(Context context, String uniqueName) {
String cachePath;
//判断 SD 卡是否存在,从而获取不同的缓存地址
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
!En