zoukankan      html  css  js  c++  java
  • android 中使用缓存加载数据

    最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据

    废话不多说,上代码

    欢迎转载,但请保留文章原始出处:) 
        博客园:http://www.cnblogs.com/wangshuaiandroid/

    首先做一个保存缓存的工具类

    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了

    人多不足以依赖,要生存只有靠自己。 深窥自己的心,而后发觉一切的奇迹在你自己。 凡事皆有终结,因此,耐心是赢得成功的一种手段。
  • 相关阅读:
    easyUI的formatter使用
    tomcat的CATALINA_HOME可以不用设置
    关于json解析中 解析多重json对象
    "i++"和"++i"浅析
    poj1050 To the Max(降维dp)
    2017年暑假ACM集训日志
    codevs1228 (dfs序+线段树)
    密钥登录服务器
    使用iwd联网
    idea和gradle创建android遇到的网络问题
  • 原文地址:https://www.cnblogs.com/wangshuaiandroid/p/5113565.html
Copyright © 2011-2022 走看看