最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据
首先做一个保存缓存的工具类
import java.io.File;
import java.io.IOException;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
public class ConfigCacheUtil {
private static final String TAG=ConfigCacheUtil.class.getName();
public static final int CONFIG_CACHE_SHORT_TIMEOUT=1000 * 60 * 5; // 5 分钟
public static final int CONFIG_CACHE_MEDIUM_TIMEOUT=1000 * 3600 * 2; // 2小时
public static final int CONFIG_CACHE_ML_TIMEOUT=1000 * 60 * 60 * 24 * 1; // 1天
public static final int CONFIG_CACHE_MAX_TIMEOUT=1000 * 60 * 60 * 24 * 7; // 7天
public enum ConfigCacheModel {
CONFIG_CACHE_MODEL_SHORT, CONFIG_CACHE_MODEL_MEDIUM, CONFIG_CACHE_MODEL_ML, CONFIG_CACHE_MODEL_LONG;
}
public static String getUrlCache(String url, ConfigCacheModel model,Context context) {
if(url == null) {
return null;
}
String result=null;
String path=Constant.ENVIROMENT_DIR_CACHE + MD5Utils.md5Encrypt(url)+".txt";
File file=new File(path);
if(file.exists() && file.isFile()) {
long expiredTime=System.currentTimeMillis() - file.lastModified();
Log.d(TAG, file.getAbsolutePath() + " expiredTime:" + expiredTime / 60000 + "min");
// 1。如果系统时间是不正确的
// 2。当网络是无效的,你只能读缓存
if(UIUtils.isNetWorkConnected(context)) {
if(expiredTime < 0) {
return null;
}
if(model == ConfigCacheModel.CONFIG_CACHE_MODEL_SHORT) {
if(expiredTime > CONFIG_CACHE_SHORT_TIMEOUT) {
return null;
}
} else if(model == ConfigCacheModel.CONFIG_CACHE_MODEL_MEDIUM) {
if(expiredTime > CONFIG_CACHE_MEDIUM_TIMEOUT) {
return null;
}
} else if(model == ConfigCacheModel.CONFIG_CACHE_MODEL_ML) {
if(expiredTime > CONFIG_CACHE_ML_TIMEOUT) {
return null;
}
} else if(model == ConfigCacheModel.CONFIG_CACHE_MODEL_LONG) {
if(expiredTime > CONFIG_CACHE_MEDIUM_TIMEOUT) {
return null;
}
} else {
if(expiredTime > CONFIG_CACHE_MAX_TIMEOUT) {
return null;
}
}
}
try {
result=FileUtils.readTextFile(file);
} catch(IOException e) {
e.printStackTrace();
}
}
return result;
}
public static void setUrlCache(String data, String url) {
if(Constant.ENVIROMENT_DIR_CACHE == null) {
return;
}
File dir=new File(Constant.ENVIROMENT_DIR_CACHE);
if(!dir.exists() && Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
dir.mkdirs();
}
File file=new File(Constant.ENVIROMENT_DIR_CACHE + MD5Utils.md5Encrypt(url)+".txt");
try {
// 创建缓存数据到磁盘,就是创建文件
FileUtils.writeTextFile(file, data);
} catch(IOException e) {
Log.d(TAG, "write " + file.getAbsolutePath() + " data failed!");
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void clearCache(File cacheFile) {
if(cacheFile == null) {
if(Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
try {
File cacheDir=new File(Environment.getExternalStorageDirectory().getPath() + "/gdxz/cache/");
if(cacheDir.exists()) {
clearCache(cacheDir);
}
} catch(Exception e) {
e.printStackTrace();
}
}
} else if(cacheFile.isFile()) {
cacheFile.delete();
} else if(cacheFile.isDirectory()) {
File[] childFiles=cacheFile.listFiles();
for(int i=0; i < childFiles.length; i++) {
clearCache(childFiles[i]);
}
}
}
}
已经写好的一个工具,只需在需要做缓存的地方调用ConfigCacheUtil.getUrlCache方法传入相应的url,类型和上下文 判断结果是否为空,如果为空说明不存在缓存请求网络加载数据。如果不为空说明缓存中有数据直接读缓存,得到result再处理json数据就ok了
以上内容是针对Android中如何加载数据缓存的方法,希望对大家有所帮助。
您可能感兴趣的文章:Android实现滑动加载数据的方法Android实现ListView分页自动加载数据的方法Android中ListView如何分页加载数据Android实现ListView数据动态加载的方法解决Android ListView数据为空及加载错误的方法Android应用中ListView利用OnScrollListener分页加载数据Android异步加载数据和图片的保存思路详解Android自定义加载控件实现数据加载动画