Android的缓存机制(java序列化)
来源:互联网 发布:阿里云香港机房 编辑:程序博客网 时间:2024/05/22 06:07
实现一个封装请求网络json数据的工具类,要求请求的数据的时候先读缓存,如果缓存有效(有效时间为3分钟),则读取缓存中的json数据,如果缓存无效,则读取网络中的json数据,并缓存起来。读取到数据的时候只需要打印一下json数据,无需写回调。public class NetUtil {public static final Class TAG = NetUtil.class;/** * 请求数据* @param url* @param params*/public static void requestData(String url, TreeMap<String, String> params) {// 1、把url 和参数拼接成完整的请求地址:String requestUrl = createRequestUrl(url, params); Logger.i(TAG, "requestUrl = " + requestUrl);// 2、获取缓存文件(File)File cacheFile = getCacheFile(requestUrl);if (chcheFileIsValid(cacheFile)) {// 3、判断缓存是否有效,如果有效的,则读缓存数据getDataFromCache(cacheFile); } else {// 4、如果缓存无效,则读网络getDataFromNet(requestUrl); } }/** * 把url和参数拼接起来,这里面使用TreeMap是因为TreeMap有排序的功能* @param url* @param params* @return*/private static String createRequestUrl(String url, TreeMap<String, String> params) {if (params == null || params.isEmpty()) {return url; }// 所参数拼接成:&index=0&age=48&page=5StringBuffer sb = new StringBuffer();for (String key: params.keySet()) { sb.append("&").append(key.trim()).append("=").append(params.get(key).trim()); } sb.deleteCharAt(0); // 删除第1个字符“&"String requestUrl = url + "?" + sb.toString();return requestUrl; }/** * 获取data/data/包名/caches中的指定的缓存文件* @param requestUrl 指定要获取的缓存文件名* @return*/private static File getCacheFile(String requestUrl) {try { requestUrl = URLEncoder.encode(requestUrl, "UTF-8"); // 文件名中不能有特殊符号,比如?,所以这里进行了编码File cacheFile = new File(MyApp.getContext().getCacheDir(), requestUrl);return cacheFile; } catch (UnsupportedEncodingException e) { e.printStackTrace(); }return null; }/** 判断缓存文件是否有效 */private static boolean chcheFileIsValid(File cacheFile) {if (cacheFile == null || !cacheFile.exists()) {return false; // 如果缓存文件不存在,则认为是无效}long validExistTime = 3 * 60 * 1000; // 有效时间是3分钟。3分钟对应的毫秒值long cacheFileExistTime = System.currentTimeMillis() - cacheFile.lastModified(); // 文件存在的时间return cacheFileExistTime < validExistTime; // 如果缓存文件存在的时间小于3分钟,则缓存文件是有效}/** * 读取缓存文件中的json内容* @param cacheFile*/private static void getDataFromCache(final File cacheFile) {new AsyncTask<Void, Void, String>() {/** 这个方法会运行到子线程 */@Overrideprotected String doInBackground(Void... params) { SystemClock.sleep(1000);// 这个睡眠是为了让我们看一看下拉刷新的时候有等待的效果。这个睡眠千万不要写到UI线程BufferedReader reader = null;try { reader = new BufferedReader(new FileReader(cacheFile)); String line; StringBuffer sb = new StringBuffer();while((line = reader.readLine()) != null) { sb.append(line).append("\n"); } String json = sb.toString();return json; // 这个结果会返回到onPostExecute(String json)中} catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(reader); }return null; }/** 这个方法会运行到UI线程 */@Overrideprotected void onPostExecute(String json) { System.out.println(json); } }.execute(); // 记得调用这个方法让doInBackground方法执行}private static void getDataFromNet(final String requestUrl) { HttpUtils httpUtils = new HttpUtils(); RequestCallBack<String> callback = new RequestCallBack<String>() {@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) { String json = responseInfo.result;cacheJson(json, requestUrl); System.out.println(json); }@Overridepublic void onFailure(HttpException e, String s) { Logger.e(TAG, "请求失败:" + s, e); } }; httpUtils.send(HttpRequest.HttpMethod.GET, requestUrl, callback); // 请求数据}/** * 把Json缓存到data/data/包名/caches中* @param json* @param requestUrl*/private static void cacheJson(String json, String requestUrl) { BufferedWriter writer = null;try { File cacheFile = getCacheFile(requestUrl); writer = new BufferedWriter(new FileWriter(cacheFile)); writer.write(json); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(writer); // 安静地关流} }}
0 0
- Android的缓存机制(java序列化)
- Java的序列化机制
- php缓存机制封装【序列化机制】
- android缓存的机制
- Java的缓存机制
- AFN框架(二)的使用和有关序列化器的问题--缓存机制------
- java序列化机制
- Java序列化机制
- java序列化机制
- Java序列化机制
- Java 序列化机制
- Java序列化机制
- Java序列化机制
- Java序列化的机制和原理(转)
- Java序列化的机制和原理(转)
- Java序列化的机制和原理
- Java序列化的机制及原理
- Java序列化的机制和原理
- matlab 高级函数
- log4j配置文件详解
- Oracle增加修改删除字段/主键
- 文章标题
- 【前端攻城狮之路】video与audio
- Android的缓存机制(java序列化)
- 日志2016.11.4
- 【Linux4.1.12源码分析】协议栈gro收包之TCP处理
- 【搬自TC_SRM583 Hard】【JZOJ4844】抗拒黄泉 题解
- java多线程之synchronized和volatile关键字
- Android用RxJava combineLatest操作符处理复杂表单验证问题
- hdoj 4198 Quick out of the Harbour(bfs,优先队列)
- 修饰函数的const和函数返回值的const区别
- 无人机——磁力计/电子罗盘 学习及校准