Android中如何加载数据缓存
最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据
首先做一个保存缓存的工具类
importjava.io.File;
importjava.io.IOException;
importandroid.content.Context;
importandroid.os.Environment;
importandroid.util.Log;
/**
*缓存工具类
*/
publicclassConfigCacheUtil{
privatestaticfinalStringTAG=ConfigCacheUtil.class.getName();
/**1秒超时时间*/
publicstaticfinalintCONFIG_CACHE_SHORT_TIMEOUT=1000*60*5;//5分钟
/**5分钟超时时间*/
publicstaticfinalintCONFIG_CACHE_MEDIUM_TIMEOUT=1000*3600*2;//2小时
/**中长缓存时间*/
publicstaticfinalintCONFIG_CACHE_ML_TIMEOUT=1000*60*60*24*1;//1天
/**最大缓存时间*/
publicstaticfinalintCONFIG_CACHE_MAX_TIMEOUT=1000*60*60*24*7;//7天
/**
*CONFIG_CACHE_MODEL_LONG:长时间(7天)缓存模式<br>
*CONFIG_CACHE_MODEL_ML:中长时间(12小时)缓存模式<br>
*CONFIG_CACHE_MODEL_MEDIUM:中等时间(2小时)缓存模式<br>
*CONFIG_CACHE_MODEL_SHORT:短时间(5分钟)缓存模式
*/
publicenumConfigCacheModel{
CONFIG_CACHE_MODEL_SHORT,CONFIG_CACHE_MODEL_MEDIUM,CONFIG_CACHE_MODEL_ML,CONFIG_CACHE_MODEL_LONG;
}
/**
*获取缓存
*@paramurl访问网络的URL
*@return缓存数据
*/
publicstaticStringgetUrlCache(Stringurl,ConfigCacheModelmodel,Contextcontext){
if(url==null){
returnnull;
}
Stringresult=null;
Stringpath=Constant.ENVIROMENT_DIR_CACHE+MD5Utils.md5Encrypt(url)+".txt";
Filefile=newFile(path);
if(file.exists()&&file.isFile()){
longexpiredTime=System.currentTimeMillis()-file.lastModified();
Log.d(TAG,file.getAbsolutePath()+"expiredTime:"+expiredTime/60000+"min");
//1。如果系统时间是不正确的
//2。当网络是无效的,你只能读缓存
if(UIUtils.isNetWorkConnected(context)){
if(expiredTime<0){
returnnull;
}
if(model==ConfigCacheModel.CONFIG_CACHE_MODEL_SHORT){
if(expiredTime>CONFIG_CACHE_SHORT_TIMEOUT){
returnnull;
}
}elseif(model==ConfigCacheModel.CONFIG_CACHE_MODEL_MEDIUM){
if(expiredTime>CONFIG_CACHE_MEDIUM_TIMEOUT){
returnnull;
}
}elseif(model==ConfigCacheModel.CONFIG_CACHE_MODEL_ML){
if(expiredTime>CONFIG_CACHE_ML_TIMEOUT){
returnnull;
}
}elseif(model==ConfigCacheModel.CONFIG_CACHE_MODEL_LONG){
if(expiredTime>CONFIG_CACHE_MEDIUM_TIMEOUT){
returnnull;
}
}else{
if(expiredTime>CONFIG_CACHE_MAX_TIMEOUT){
returnnull;
}
}
}
try{
result=FileUtils.readTextFile(file);
}catch(IOExceptione){
e.printStackTrace();
}
}
returnresult;
}
/**
*设置缓存
*@paramdata
*@paramurl
*/
publicstaticvoidsetUrlCache(Stringdata,Stringurl){
if(Constant.ENVIROMENT_DIR_CACHE==null){
return;
}
Filedir=newFile(Constant.ENVIROMENT_DIR_CACHE);
if(!dir.exists()&&Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
dir.mkdirs();
}
Filefile=newFile(Constant.ENVIROMENT_DIR_CACHE+MD5Utils.md5Encrypt(url)+".txt");
try{
//创建缓存数据到磁盘,就是创建文件
FileUtils.writeTextFile(file,data);
}catch(IOExceptione){
Log.d(TAG,"write"+file.getAbsolutePath()+"datafailed!");
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*删除历史缓存文件
*@paramcacheFile
*/
publicstaticvoidclearCache(FilecacheFile){
if(cacheFile==null){
if(Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
try{
FilecacheDir=newFile(Environment.getExternalStorageDirectory().getPath()+"/gdxz/cache/");
if(cacheDir.exists()){
clearCache(cacheDir);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}elseif(cacheFile.isFile()){
cacheFile.delete();
}elseif(cacheFile.isDirectory()){
File[]childFiles=cacheFile.listFiles();
for(inti=0;i<childFiles.length;i++){
clearCache(childFiles[i]);
}
}
}
}
已经写好的一个工具,只需在需要做缓存的地方调用ConfigCacheUtil.getUrlCache方法传入相应的url,类型和上下文判断结果是否为空,如果为空说明不存在缓存请求网络加载数据。如果不为空说明缓存中有数据直接读缓存,得到result再处理json数据就ok了
以上内容是针对Android中如何加载数据缓存的方法,希望对大家有所帮助。