Android进行数据本地缓存的方式,google官方认可方式。
适用场景:网络获取数据(文字,图片)进行本地缓存,无网络时读取本地缓存显示数据。
使用步骤:
1.在项目中创建libcore.io包,将DiskLruCache.java文件放入包中。
DiskLruCache.java地址:点击进入下载页
2.获取DiskLruCache 实例化对象
/** * 获取DiskLruCache,创建(如果不存在)一个文件名为json的文件夹 */ public DiskLruCache mDiskLruCache = null; public void getMDiskLruCache(){ try { //获取缓存的存储路径 File cacheDir = getDiskCacheDir(this, "json"); if (!cacheDir.exists()) { cacheDir.mkdirs(); } //获取DiskLruCache对象 参数1:缓存路径 参数2:app应用版本号 参数3:DiskLruCache版本号 参数4:设置缓存空间大小 mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(this), 1, 10 * 1024 * 1024); } catch (IOException e) { e.printStackTrace(); } } /** * 获取缓存的存储路径 */ public File getDiskCacheDir(Context context, String uniqueName) { String cachePath; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) { // 获取/sdcard/Android/data/<application package>/cache cachePath = context.getExternalCacheDir().getPath(); } else { //获取/data/data/<application package>/cache; cachePath = context.getCacheDir().getPath(); } return new File(cachePath + File.separator + uniqueName); } /** * 获取应用程序版本号 */ public int getAppVersion(Context context) { try { PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return info.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return 1; } /** * md5生成唯一文件名 */ public String hashKeyForDisk(String key) {
String cacheKey;3.保存文件属于耗时操作,实际开发中应在子线程中执行。首先对你要保存的文件命名 一般使用md5生成唯一表示作为文件名这里假设有首页的json数据要保存 命名为homejson作为首页json数据的文件保存名String fileKey=hashKeyForDisk("homejson");
try {
final MessageDigest mDigest = MessageDigest. getInstance ( "MD5" );
mDigest.update(key.getBytes());
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String. valueOf (key.hashCode());
}
return cacheKey;
}
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < bytes. length ; i++) {
String hex = Integer. toHexString ( 0xFF & bytes[i]);
if (hex.length() == 1 ) {
sb.append( '0' );
}
sb.append(hex);
}
return sb.toString();
}
将数据写入设定的缓存文件中:就是通过edit获得一个outputStream流 将文件写入
这里是写入了一个json数据 如果是图片也是同样的道理 只是把bitmap打入流里。
String info="假设这就是首页获取的json数据"
try {
DiskLruCache.Editor edit = mDiskLruCache.edit(fileKey);
OutputStream outputStream = edit.newOutputStream(0);
outputStream.write(info.getBytes());
outputStream.flush();
outputStream.close();
edit.commit();
//不要频繁的刷flush() 会费时间 这个一般放在activity的onPause()写就好了
mDiskLruCache.flush();
} catch (IOException e) {
e.printStackTrace();
}
这样数据就存入了cache下json文件下了 文件名是homejson这个字段进行md5加密后的一串字母数字组合
4.读取缓存
直接用制定的文件名 md5生成 保存的文件名 然后去读取就可以了
获得一个输入流 读取文件 转化问文字或者bitmap
以下就是读取3步骤保存的一个字符串。
try {
String fileKey=hashKeyForDisk("homejson");
DiskLruCache.Snapshot snapShot = mDiskLruCache.get(fileKey);
if (snapShot != null) {
//snapShot.getInputStream(0);传比disklrucache版本号小 这里穿0
InputStream is = snapShot.getInputStream(0);
byte[] by=new byte[1024];
int i=0;
StringBuffer sb=new StringBuffer();
while((i=is.read(by))!=-1){
sb.append(new String(by,0,by.length));
}
String infom=sb.toString();
mTVShow.setText(infom+"*");
}
} catch (IOException e) {
e.printStackTrace();
}
基本的存储,读取使用就这几步,当然DiskLruCache还提供了删除操作。直接remove(String key)就可以了
最重要的方法:
1.没有特别的情况 在activity的onPause()中调用mDiskLruCache.flush()就足够了
在DiskLruCache缓存路径下会有一个日志文件journal 记录管理这缓存区域下的所有操作信息(时间,key....),
唯一一个也是最重要的文件,flush()操作是把操作信息同步进入这个文件中。
2.在activity的iondestory()中调用 disklrycache的close()方法关闭操作。
3.使用delete方法会删除缓存下的多有文件 一般做清除缓存用。
。。基本用的就这些。。