最近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了

android 中使用缓存加载数据的更多相关文章

  1. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  2. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  3. Android中ListView异步加载数据

    1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...

  4. Android中的分页加载

    //----------------------MainActivity中--------------------------------------------------- package com ...

  5. arcgis android 中shapefile的加载

    前言 本文为大家分享arcgis android 中shapefile的加载,默认你有java环境,懂一定的android基础知识,默认你已经安装android studio.如缺乏以上环境和知识,请 ...

  6. vue 中监测滚动条加载数据(懒加载数据)

    vue 中监测滚动条加载数据(懒加载数据) 1:钩子函数监听滚动事件: mounted () { this.$nextTick(function () { window.addEventListene ...

  7. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  8. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  9. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

随机推荐

  1. [转载]VIM命令合集

    Vim命令合集 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 命令历史 以:和/开头的命令都有历史纪录, ...

  2. Java中通过递归调用删除文件夹下所有文件

    摘自 : http://blog.sina.com.cn/s/blog_79333b2c0100xiu4.html import java.io.File; public class FileTest ...

  3. django post方法不能提交

    def login(request): if request.method == 'GET': c = {} c.update(csrf(request)) return render_to_resp ...

  4. Oracle11g R2学习系列 之四Maven+Struts+Spring实验

    今天试一下Java调用Oracle来看一下.会不会也如昨天实验的一样坑呢?由于我对于Java也接触的不多,所以不打算直接使用该收提供的实验文档,而是自己利用Maven+Struts+Spring来自己 ...

  5. [转]jQuery插件开发精品教程,让你的jQuery提升一个台阶

    原文链接:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其 ...

  6. Android开发重修

    Android程序开发的重新学习 #####Mars课程学习笔记20140926 1.Service主要用于完成耗时较长的操作,没有图形化界面. 2.Content Provider数据的提供者,是A ...

  7. 【7】python核心编程 第十一章-函数和函数式编程

    1.*函数(与方法)装饰器 装饰器背后的主要动机源自python 面向对象编程.装饰器是在函数调用之上的修饰.这些修饰 仅是当声明一个函数或者方法的时候,才会应用的额外调用. 装饰器的语法以@开头,接 ...

  8. C语言变量的存储类别

    我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...

  9. BufferedInputStream实现原理分析

    原文地址:http://blog.sina.com.cn/s/blog_67f995260101huxz.html BufferedInputStream是一个带有缓冲区的输入流,通常使用它可以提高我 ...

  10. linux虚拟机网络连接模式 bridged, host-only, NAT

    最近安装了fedora9.0,却一直不能连接到外网,我用的是3G无线网卡上网的,起初以为是linux不支持3G无线方式的,可后来装了虚拟机ubuntu却可以上网,在后来用有ADSL网络连接的电脑安装f ...