DiskLruCache不同于LruCache,LruCache是将数据缓存在内存当中,而DiskLruCache是外部存储缓存,是将数据永久缓存到手机外部存储介质中去,并可以将缓存数据取出来使用,DiskLruCache不是google官方所写,但是得到了google的推荐。
DiskLruCache下载地址:
https://github.com/JakeWharton/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() | 缓存数据的目录 |
使用方法
-
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
-
DiskLruCache是在外部存储上的,需要判断外部存储是否存在
private static File getExternalCacheDir(Context context) { File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data"); File appCacheDir = new File(new File(dataDir, context.getPackageName()), "cache"); if (!appCacheDir.exists()) { if (!appCacheDir.mkdirs()) { return null; } } return appCacheDir; }
-
初始化DiskLruCache
private void init(File cacheDir, Context context) { try { mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024); } catch (IOException e) { e.printStackTrace(); } }
-
写入缓存
@Override public void put(String key, String value) { DiskLruCache.Editor editor = null; try { editor = mDiskLruCache.edit(hashKeyForDisk(key)); if (editor != null) { editor.set(0, value); editor.commit(); } mDiskLruCache.flush(); } catch (IOException e) { e.printStackTrace(); } }
-
读取缓存
@Override public String get(String key) { String result = null; try { DiskLruCache.Snapshot snapShot = mDiskLruCache.get(hashKeyForDisk(key)); if (snapShot != null) { result = snapShot.getString(0); return result; } } catch (IOException e) { e.printStackTrace(); return null; } return result; }
总结
有了工具类数据缓存就变得非常简单,下一讲,我们做一个二级缓存框架ManbaCacheManager
每天多努力那么一点点,积少成多