缓存类  :

public class ConfigCache {

    private static final String TAG = ConfigCache.class.getName();

    public static final int CONFIG_CACHE_MOBILE_TIMEOUT  = 3600000;  //1 hour
public static final int CONFIG_CACHE_WIFI_TIMEOUT = 300000; //5 minute public static String getUrlCache(String url) {
if (url == null) {
return null; }
String result = null;
File file = new File(AppApplication.mSdcardDataDir + "/" + getCacheDecodeString(url));
if (file.exists() && file.isFile()) {
long expiredTime = System.currentTimeMillis() - file.lastModified(); Log.d(TAG, file.getAbsolutePath() + " expiredTime:" + expiredTime/60000 + "min"); //1. in case the system time is incorrect (the time is turn back long ago) //2. when the network is invalid, you can only read the cache if (AppApplication.mNetWorkState != NetworkUtils.NETWORN_NONE && expiredTime < 0) { return null; }
if(AppApplication.mNetWorkState == NetworkUtils.NETWORN_WIFI && expiredTime > CONFIG_CACHE_WIFI_TIMEOUT) { return null; } else if (AppApplication.mNetWorkState == NetworkUtils.NETWORN_MOBILE && expiredTime > CONFIG_CACHE_MOBILE_TIMEOUT) {
return null;
}
try { result = FileUtils.readTextFile(file); } catch (IOException e) { e.printStackTrace();
} } return result;
} public static void setUrlCache(String data, String url) { File file = new File(AppApplication.mSdcardDataDir + "/" + getCacheDecodeString(url)); try { //创建缓存数据到磁盘,就是创建文件 FileUtils.writeTextFile(file, data); } catch (IOException e) { Log.d(TAG, "write " + file.getAbsolutePath() + " data failed!"); e.printStackTrace(); } }
public static String getCacheDecodeString(String url) { //1. 处理特殊字符 //2. 去除后缀名带来的文件浏览器的视图凌乱(特别是图片更需要如此类似处理,否则有的手机打开图库,全是我们的缓存图片) if (url != null) { return url.replaceAll("[.:/,%?&=]", "+").replaceAll("[+]+", "+"); } return null; }
}

用法  :

void getConfig(){

        //首先尝试读取缓存

        String cacheConfigString = ConfigCache.getUrlCache(CONFIG_URL);

        //根据结果判定是读取缓存,还是重新读取

        if (cacheConfigString != null) {

       //     showConfig(cacheConfigString);   //后面可以是UI更新,仅供参考

        } else {

            //如果缓存结果是空,说明需要重新加载

            //缓存为空的原因可能是1.无缓存;2. 缓存过期;3.读取缓存出错

            AsyncHttpClient client = new AsyncHttpClient();

            client.get(CONFIG_URL, new AsyncHttpResponseHandler(){

                @Override

                public void onSuccess(String result){

                    //成功下载,则保存到本地作为后面缓存文件

                    ConfigCache.setUrlCache(result,  CONFIG_URL);

                    //后面可以是UI更新,仅供参考
// showConfig(result); }
@Override public void onFailure(Throwable arg0) { //根据失败原因,考虑是显示加载失败,还是再读取缓存
} });
}
}

相关的工具类 :

/**
* 文件处理工具类
*
* @author naibo-liao
* @时间: 2013-1-4下午03:13:08
*/
public class FileUtils { public static final long B = 1;
public static final long KB = B * 1024;
public static final long MB = KB * 1024;
public static final long GB = MB * 1024;
private static final int BUFFER = 8192;
/**
* 格式化文件大小<b> 带有单位
*
* @param size
* @return
*/
public static String formatFileSize(long size) {
StringBuilder sb = new StringBuilder();
String u = null;
double tmpSize = 0;
if (size < KB) {
sb.append(size).append("B");
return sb.toString();
} else if (size < MB) {
tmpSize = getSize(size, KB);
u = "KB";
} else if (size < GB) {
tmpSize = getSize(size, MB);
u = "MB";
} else {
tmpSize = getSize(size, GB);
u = "GB";
}
return sb.append(twodot(tmpSize)).append(u).toString();
} /**
* 保留两位小数
*
* @param d
* @return
*/
public static String twodot(double d) {
return String.format("%.2f", d);
} public static double getSize(long size, long u) {
return (double) size / (double) u;
} /**
* sd卡挂载且可用
*
* @return
*/
public static boolean isSdCardMounted() {
return android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
} /**
* 递归创建文件目录
*
* @param path
* */
public static void CreateDir(String path) {
if (!isSdCardMounted())
return;
File file = new File(path);
if (!file.exists()) {
try {
file.mkdirs();
} catch (Exception e) {
Log.e("hulutan", "error on creat dirs:" + e.getStackTrace());
}
}
} /**
* 读取文件
*
* @param file
* @return
* @throws IOException
*/
public static String readTextFile(File file) throws IOException {
String text = null;
InputStream is = null;
try {
is = new FileInputStream(file);
text = readTextInputStream(is);;
} finally {
if (is != null) {
is.close();
}
}
return text;
} /**
* 从流中读取文件
*
* @param is
* @return
* @throws IOException
*/
public static String readTextInputStream(InputStream is) throws IOException {
StringBuffer strbuffer = new StringBuffer();
String line;
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(is));
while ((line = reader.readLine()) != null) {
strbuffer.append(line).append("\r\n");
}
} finally {
if (reader != null) {
reader.close();
}
}
return strbuffer.toString();
} /**
* 将文本内容写入文件
*
* @param file
* @param str
* @throws IOException
*/
public static void writeTextFile(File file, String str) throws IOException {
DataOutputStream out = null;
try {
out = new DataOutputStream(new FileOutputStream(file));
out.write(str.getBytes());
} finally {
if (out != null) {
out.close();
}
}
} /**
* 将Bitmap保存本地JPG图片
* @param url
* @return
* @throws IOException
*/
public static String saveBitmap2File(String url) throws IOException { BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null; SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
String timeStamp = sf.format(new Date());
File targetFile = new File(Constants.ENVIROMENT_DIR_SAVE, timeStamp
+ ".jpg");
File oldfile = ImageLoader.getInstance().getDiscCache().get(url);
try { inBuff = new BufferedInputStream(new FileInputStream(oldfile));
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
byte[] buffer = new byte[BUFFER];
int length;
while ((length = inBuff.read(buffer)) != -1) {
outBuff.write(buffer, 0, length);
}
outBuff.flush();
return targetFile.getPath();
} catch (Exception e) { } finally {
if (inBuff != null) {
inBuff.close();
}
if (outBuff != null) {
outBuff.close();
}
}
return targetFile.getPath();
} /**
* 读取表情配置文件
*
* @param context
* @return
*/
public static List<String> getEmojiFile(Context context) {
try {
List<String> list = new ArrayList<String>();
InputStream in = context.getResources().getAssets().open("emoji");// 文件名字为rose.txt
BufferedReader br = new BufferedReader(new InputStreamReader(in,
"UTF-8"));
String str = null;
while ((str = br.readLine()) != null) {
list.add(str);
} return list;
} catch (IOException e) {
e.printStackTrace();
}
return null;
} /**
* 获取一个文件夹大小
*
* @param f
* @return
* @throws Exception
*/
public static long getFileSize(File f) {
long size = 0;
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist.isDirectory()) {
size = size + getFileSize(flist);
} else {
size = size + flist.length();
}
}
return size;
} /**
* 删除文件
*
* @param file
*/
public static void deleteFile(File file) { if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete(); // delete()方法 你应该知道 是删除的意思;
} else if (file.isDirectory()) { // 否则如果它是一个目录
File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
deleteFile(files); // 把每个文件 用这个方法进行迭代
}
}
file.delete();
}
}
}

android文件缓存管理的更多相关文章

  1. android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决

    1.相关代码: 加入权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ...

  2. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  3. (转)Android技术积累:图片缓存管理

    如果每次加载同一张图片都要从网络获取,那代价实在太大了.所以同一张图片只要从网络获取一次就够了,然后在本地缓存起来,之后加载同一张图片时就从缓存中加载就可以了.从内存缓存读取图片是最快的,但是因为内存 ...

  4. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。

    转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序  在开发过程中,client 和 server 数据交流一 ...

  5. app缓存设计-文件缓存

    采用缓存,可以进一步大大缓解数据交互的压力,又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不需要实时更新,哪怕是3-5分钟的延迟也是可以采用缓 ...

  6. 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现

    转载请注明 ☞ http://blog.csdn.net/leverage_1229 上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于惯性,都会在设计之前查阅相关 ...

  7. [置顶] 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于 ...

  8. 转 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现

    上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于惯性,都会在设计之前查阅相关资料,尽量避免拿一些以前2.3平台积累的经验来进行类比处理.开发文档中有一个 Bitm ...

  9. Android离线缓存

    android做到一定程度,需要考虑缓存的问题,不信可以掏出手机看看淘宝等一些app是否无网的情况下还可以浏览,不过大部分app并没有考虑到这些问题,解决Android的缓存有哪些方法呢 1.IO流读 ...

随机推荐

  1. Memcache简介 & 内存分配机制

            关于这个东西里面到底应该存放数据网上一直有很多种说法,有的说sql进行md5之后作为键值,结果作为内容存放,也有人说按照业务逻辑错放,反正是炒的不亦乐乎.        本人经过将近2 ...

  2. java:RandomAccessFile随机读取文件内容

    RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. ...

  3. unity监测按下键的键值并输出+unity键值

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  4. 牛客练习赛7E 珂朵莉的数列

    题意:求所有子区间的逆序数对数之和 题解:树状数组维护,对于每一对逆序数(l,r)属于l*(n-r+1)个区间,计算每一对对结果的贡献即可,可用树状数组维护,sum维护(n-r+1),按逆序数那样操作 ...

  5. URL格式和urlencode

    URL的格式:protocol :// hostname[:port] / path / [;parameters][?query]#fragment URL出现了有+,空格,/,?,%,#,& ...

  6. 原生js模态框实现

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. android不同的按钮一起点击崩溃解决

    public class ButtonUtils { private static long lastClickTime; public synchronized static boolean isF ...

  8. mvc那些事

    mvc的特点: 1.无控件,有HtmlHelper类,此类提供了各种生成html控件的方法.如果不能满足需要,就自定义扩展吧,比如说分页显示.HtmlHelper类提供了Partial(加载局部视图) ...

  9. 作业派NABCD的特点分析

    Need:根据我们用户的调查,我们发现用户希望在作业派获取一些课本上的答案等类似的东西,以方便及时解决课本的问题. Approach:但是仅仅靠管理员来上传文件时园不能解决用户的问题.所以我们想让我们 ...

  10. 利用PIL添加水印

    转:http://www.jb51.net/article/66542.htm