码迷,mamicode.com
首页 > 移动开发 > 详细

Android 数据缓存-文件存储

时间:2015-04-12 14:51:15      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:android   缓存   

Android APP开发过程中,我们通常会加入缓存模块。缓存即在本地保存APP的一些数据,大部分是将网络请求的数据进行本地保存,这样在缓存数据有效期内就可以直接使用缓存数据,降低了APP和服务器的压力,也极大提升了用户体验。Android数据缓存既可以以数据表的形式进行保存,也可以以文件的形式进行缓存。这里我主要通过缓存文件存储数据,并在APP下一次启动时读取。

Usage

整个Cache模块的设计思想很简单,每个缓存数据都对应一个key,每个缓存数据又会被存到以此key命名的文件中,需要时直接读取。关键类分别为CacheData, CacheManager, CacheUtils

  • CacheData:数据封装类,所有欲缓存的数据都通过CacheData封装,CacheData中能够定义缓存有效期,并可以通过getData()直接获取真实的缓存数据。
  • CacheManager: 缓存管理类,单例模式设计,负责缓存的存储和读取。
  • CacheUtils: 缓存常用类,所有的缓存Key都应该在这个类中定义,此类还定义了一些时间常量,缓存有效期中可以使用。

使用方法如下:

  • step1: CacheManager.init(Context context), 在APP加载时就应该对CacheManager初始化。
  • step2: 自定义的Model需要实现序列化,使用CacheData进行包装,然后使用CacheManager进行存储和读取。

Source

CacheUtils.java 主要用来存放一些常用变量

public class CacheUtils {


    public final static String KEY_TEST = "key_test";


    public final static long EXPIRATION_MINUTE = 60 * 1000;
    public final static long EXPIRATION_HOUR =  60 * EXPIRATION_MINUTE;
    public final static long EXPIRATION_DAY =  24 * EXPIRATION_HOUR;
    public final static long EXPIRATION_WEEK = 7 * EXPIRATION_DAY;
}

CacheData.java 用来存储的数据结构

import java.io.Serializable;

public class CacheData<T> implements Serializable {

    private long lastUpdated;
    private String key;
    private T data;
    private long expiration;

    public CacheData(String key, T data) {
        this(key, data, -1);
    }
    public CacheData(String key, T data, long expiration) {
        this.key = key;
        this.expiration = expiration;
        setData(data);
    }

    public void setData(T data) {
        this.data = data;
        this.lastUpdated = System.currentTimeMillis();
    }

    public boolean isValid() {
        return expiration == -1 || lastUpdated + expiration > System.currentTimeMillis();
    }

    public String getKey() {
        return key;
    }

    public T getData() {
        return data;
    }
}

CacheManager.java 读取与存储缓存

import android.content.Context;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class CacheManager {


    private static CacheManager instance;
    private static Context mContext;

    public static void init(Context context) {
        mContext = context;
    }

    private CacheManager() {

    }

    public static CacheManager getInstance() {
        if (instance == null) instance = new CacheManager();
        return instance;
    }

    public void addCache(CacheData cacheData) {
        if (cacheData == null) return;
        try {
            File file = new File(mContext.getCacheDir(), cacheData.getKey());
            if (!file.exists()) {
                file.createNewFile();
            }
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(cacheData);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public CacheData getCache(String key) {
        try {
            File file = new File(mContext.getCacheDir(), key);
            if (file == null) return null;
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            CacheData cacheData = (CacheData) ois.readObject();
            ois.close();
            if (cacheData.isValid()) return cacheData;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

}

Code Download

项目代码托管在Github Repo中,欢迎star和fork。

Android 数据缓存-文件存储

标签:android   缓存   

原文地址:http://blog.csdn.net/gongmingqm10/article/details/45009397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!