最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据
首先做一个保存缓存的工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
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();
/** 1秒超时时间 */
public static final int CONFIG_CACHE_SHORT_TIMEOUT= 1000 * 60 * 5 ; // 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天
/**
* CONFIG_CACHE_MODEL_LONG : 长时间(7天)缓存模式 <br>
* CONFIG_CACHE_MODEL_ML : 中长时间(12小时)缓存模式<br>
* CONFIG_CACHE_MODEL_MEDIUM: 中等时间(2小时)缓存模式 <br>
* CONFIG_CACHE_MODEL_SHORT : 短时间(5分钟)缓存模式
*/
public enum ConfigCacheModel {
CONFIG_CACHE_MODEL_SHORT, CONFIG_CACHE_MODEL_MEDIUM, CONFIG_CACHE_MODEL_ML, CONFIG_CACHE_MODEL_LONG;
}
/**
* 获取缓存
* @param url 访问网络的URL
* @return 缓存数据
*/
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;
}
/**
* 设置缓存
* @param data
* @param url
*/
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();
}
}
/**
* 删除历史缓存文件
* @param cacheFile
*/
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了