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
原创粉丝点击