您的位置:首页 > 移动开发 > Android开发

Android DiskLruCache学习笔记

2015-12-25 16:05 501 查看
转载请注明出处:http://blog.csdn.net/ibelieveyouwxy/article/details/50403659

最近无聊刷糗百,发现糗百在没有网络的情况下,还是可以看到上次退出时候的数据,于是想探究一下糗百的数据缓存是怎么做的,网上找了很多资料之后,发现了一个很棒的硬盘缓存方案。DiskLruCache ,一个Google推荐的缓存方案,虽然不是Google官方编写。


废话不多说,先上下载地址,在OKhttp里面封装了这个文件,如果用okhttp做数据请求的话,可以直接查看diskLruCache。DiskLruCache下载地址

-如果我们要创建一个DiskLruCache的实例,则需要调用它的open()方法

public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)


* 第一个参数指定的是数据的缓存地址
* 第二个参数指定当前应用程序的版本号
* 第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1
* 第四个参数指定最多可以缓存多少字节的数据


当然啦,我们可以封装一个manager类,来实现各个方法:

public synchronized boolean open(Context context, String uniqueName) {
try {
File cacheDir = getDiskCacheDir(context, uniqueName);
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
cache = DiskLruCache.open(cacheDir, getAppVersion(context), valueCount, size);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}


这是一个实现open的方法,在里面还包含了一个getDiskCacheDir方法,来获取缓存的地址和getAPPVersion方法来获取app版本:

private File getDiskCacheDir(Context context, String uniqueName) {
String cachePath;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else
cachePath = context.getCacheDir().getPath();
return new File(cachePath + File.separator + uniqueName);
}

private int getAppVersion(Context context) {
try {
PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return info.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return 1;
}


获取缓存的地址,如果内存卡存在,调用getExternalCacheDir获取缓存位置

获取到位置为:/sdcard/Android/data//cache

内存卡不存在,调用getCacheDir获取位置

获取位置为:/data/data//cache

-存储缓存数据:

public Editor edit(String key)


/**
* 存储一个obj对象
*
* @param key
* @param obj
* @return
*/
public synchronized boolean put(String key, Object obj) {
String json = gson.toJson(obj);
DiskLruCache.Editor editor = null;
try {
editor = cache.edit(key);
editor.set(0, json);
editor.commit();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

/**
* 存储一个String对象
*
* @param key
* @param str
* @return
*/
public synchronized boolean put(String key, String str) {
DiskLruCache.Editor editor = null;
try {
editor = cache.edit(key);
editor.set(0, str);
editor.commit();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}


-取出存储的数据:

public synchronized Snapshot get(String key)


/**
* 取出缓存数据
* 取出的是Object对象
*
* @param key
* @param type
* @param <T>
* @return
*/
public synchronized <T> T get(String key, Type type) {
try {
String data = cache.get(key).getString(0);
T o = gson.fromJson(data, type);
return o;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

/**
* 取出数据,非obj对象
*
* @param key
* @param <T>
* @return
*/
public synchronized <T> T get(String key) {
try {
String data = cache.get(key).getString(0);
T o = (T) data;
return o;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}


-移除某个缓存数据

public synchronized boolean remove(String key)


封装方法如下:

根据返回的boolean值判断移除是否成功!

public synchronized boolean remove(String key) {
try {
cache.remove(key);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}


-获取缓存的总大小

public synchronized long size()


前缓存路径下所有缓存数据的总字节数,以byte为单位,如果应用程序中需要在界面上显示当前缓存数据的总大小,就可以通过调用这个方法计算出来

public synchronized long getSize() {
if (!cache.isClosed())
return cache.size();
return 9999;
}


-关闭缓存,这个方法跟open方法是对应的

public synchronized void close()


关闭掉了之后就不能再调用DiskLruCache中任何操作缓存数据的方法,

通常只应该在Activity的onDestroy()方法中去调用close()方法。

public synchronized void close() {
try {
cache.close();
} catch (IOException e) {
e.printStackTrace();
}
}


-清除缓存功能

public void delete()


这个方法用于将所有的缓存数据全部删除,

手动清理缓存功能,这个入口一般在设置里面显示,是否清除缓存。

只需要调用一下DiskLruCache的delete()方法就可以实现了。

public synchronized void delete() {
try {
if (!cache.isClosed())
cache.delete();
} catch (IOException e) {
e.printStackTrace();
}
}


以上就是关于DiskLruCache的主要功能,写的不好,还望斧正!一起交流,共同进步。

下载DiskLruCacheManager 和DiskLruCache地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 缓存 硬盘