DiskLruCache
DiskLruCache用于实现磁盘缓存,它将缓存对象写入文件系统实现缓存。
由于不是Google官方的,所以需要自己下载,Google source上的源码是有些问题的,推荐去CSDN上下载,地址如下:
http://download.csdn.net/detail/sinyu890807/7709759
下载好源码之后,直接拷进项目中就行了。
打开缓存
首先DiskLruCache不可以new出实例,因此想要创建一个DiskLruCache实例,需要用它的open方法:
|
|
一共4个参数,分别介绍下,首先第一个参数是数据的缓存地址,第二个参数是应用版本号,第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1,第四个参数指定可以缓存多少字节的数据。
获取缓存地址的方法如下:
|
|
获取应用版本号方法:
|
|
最后两个参数一个传1,一个传10M,因此一个open方法如下:
|
|
至此,一个DiskLruCache就创建好了,接下来就看它的写入,读取,删除等方法。
写入缓存
以图片资源为例,假设要缓存一张网络图片,首先是将资源下载下来,基本的代码如下:
|
|
访问urlString中的网址,并通过outputStream写到本地,之后即可以开始写入的操作了。DiskLruCache的写入操作是通过 DiskLruCache.Editor这个类完成,这个类也不能new出实例,需要通过edit方法获取实例:
|
|
上述方法需要一个key,这个key将会成为缓存文件的文件名,并且需要和图片的URl一一对应,因此比较好的做法就是将图片的URL进行MD5编码,这样编码过后的字符串肯定唯一,而且只包含0-F的字符。MD5编码的代码如下:
|
|
这样的话,一次完整写入操作的代码就如下所示:
|
|
需要注意几个点
- newOutputStream方法接收一个index参数,由于前面设置valueCount的时候指定1,所以这里传0;
- 写入方法完成后,需要调用commit方法才能使写入生效,abort表示放弃此次写入。
- 由于调用了downloadUrlToString方法,因此需要确保这段代码在子线程中之行;
- 最后调用flush方法;这个flush方法并不需要每次写入的时候都去调用,比较标准的做法是在Activity的onPause方法中去调用一次。用于将内存中的操作记录同步到日志文件(journal文件)
读取缓存
读取缓存主要借助DiskLruCache的get方法,它的接口如下所示:
|
|
需要传入之前的key,返回的是一个Snapshot对象,只需要调用它的getInputStream方法就可以得到缓存文件的输入流。一段完整的读取缓存的代码如下所示:
|
|
用BitmapFactory的decodeStream方法将文件流解析成Bitmap对象,并将它设置到Image View中。
移除缓存
移除缓存用DiskLruCache的remove方法:
|
|
其他API
再来介绍一下其他的API
- size() 这个方法会返回当前缓存路径下所有缓存数据的总字节数,以byte为单位。一般用来计算当前缓存数据的总大小。
- flush() 这个方法之前也有提到过,它用于将内存中的操作记录同步到日志文件(journal文件)。通常在Activity的onPause方法中调用一次flush().
- close() 用来关闭DiskLruCache,通常在destroy中调用。
- delete() 将所有缓存删除,通常在需要手动清理缓存的时候,调用。