Android中如何加载数据缓存

 更新时间:2016年02月13日 18:35:38   作者:wang_shuai  
这篇文章主要介绍了Android中如何加载数据缓存的相关资料,需要的朋友可以参考下

最近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(); 
/** 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了

以上内容是针对Android中如何加载数据缓存的方法,希望对大家有所帮助。

相关文章

  • Android StatusBar 透明化方法(不同的版本适配)

    Android StatusBar 透明化方法(不同的版本适配)

    本篇文章主要介绍了Android StatusBar 透明化方法(不同的版本适配),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • React-Native之Android(6.0及以上)权限申请详解

    React-Native之Android(6.0及以上)权限申请详解

    这篇文章主要介绍了React-Native之Android(6.0及以上)权限申请详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android Room的使用详解

    Android Room的使用详解

    这篇文章主要介绍了Android Room的使用详解,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • Android使用RecycleView实现拖拽交换item位置

    Android使用RecycleView实现拖拽交换item位置

    这篇文章主要为大家详细介绍了Android使用RecycleView实现拖拽交换item位置,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 支持多项选择的ExpandableListView

    支持多项选择的ExpandableListView

    这篇文章主要为大家详细介绍了支持多项选择的ExpandableListView,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android开发之使用ExifInterface获取拍照后的图片属性

    Android开发之使用ExifInterface获取拍照后的图片属性

    这篇文章主要介绍了Android开发之使用ExifInterface获取拍照后的图片属性,较为详细的分析了ExifInterface类操作图片的具体使用技巧,需要的朋友可以参考下
    2016-01-01
  • 浅谈React Native打包apk的坑

    浅谈React Native打包apk的坑

    下面小编就为大家带来一篇浅谈React Native打包apk的坑。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android实现给TableLayou绘制边框的方法

    Android实现给TableLayou绘制边框的方法

    这篇文章主要介绍了Android实现给TableLayou绘制边框的方法,涉及Android TableLayou布局控制相关技巧,需要的朋友可以参考下
    2016-03-03
  • Android自定义View绘制贝塞尔曲线的方法

    Android自定义View绘制贝塞尔曲线的方法

    这篇文章主要为大家详细介绍了Android自定义View绘制贝塞尔曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Android开发实现的Intent跳转工具类实例

    Android开发实现的Intent跳转工具类实例

    这篇文章主要介绍了Android开发实现的Intent跳转工具类,简单描述了Intent组件的功能并结合实例形式给出了页面跳转、拍照、图片调用等相关操作技巧,需要的朋友可以参考下
    2017-11-11

最新评论