如何为Android缓存数据到本地

来源:互联网 发布:淘宝哪家店铺级别最高 编辑:程序博客网 时间:2024/05/16 09:54

如何为Android缓存数据到本地

对于一个应用来说,有许多的数据是不需要实时访问网络的,或者在用户第二次打开应用的时候 ,访问网络可能不是特别的快 ,但是此时的应用是没有数据展示的,这时候就会涉及到 数据的缓存,数据的缓存 可以提高用户的体验 也可以 为用户节省不必要的流量。

缓存思路:

1: 如果你的数据更新的频率比较高,这时候要是缓存数据的话 ,那么 这时候的缓存数据 是有过期时间的,当然 还得看你怎么做缓存,如果 你是仅仅只是先访问网络之后 在替换缓存数据的话 ,这时候缓存就不会有什么过期的时间,这时候的缓存只是为了 在没有网络的情况下 ,用户也可以看到上一次的数据。

2: 如果你的数据 更新的频率不是很高的话 ,这时候 你也可以设置缓存的过期时间,也可以不用设置,比如说 访问网络后直接替换掉上一次的缓存数据。

3: 需要缓存的数据 有基本的数据 还有图片或者视频,今天只说 基本数据的缓存。

缓存的方式

1:数据库
:数据库一般缓存的是关系型比较强的数据,比如联系人等数据

2:文件
:文件一般可以缓存任何你想缓存的数据

3:xml/sp(SharedPreferences)
:这种方式主要缓存一些应用的配置信息

我要讲的缓存方式

我在做缓存时一般采用的是 用文件做缓存

图片展示:

有网的情况下:

有网的情况下:

无网的情况下:

无网的情况下:

那么缓存到底应该怎么做呢? 下面 我就讲一下我以前做缓存的案例

缓存到底要缓存些什么呢?其实缓存要么缓存的是你从服务器拿到的json数据,要么缓存的是你解析json后得到的集合或者对象,也就是说,等你访问网络成功后,解析完json数据后,把你得到的集合或者对象用文件的形式存到本地。

比如:你从服务器拿到json数据后解析完之后得到的集合是 ArrayList<SubjectInfo> mData = new ArrayList<>() ,SubjectInfo是一个对象,那么这时候 你要做的就是把 mData集合用文件的形式存到本地去, 怎么存呢?看代码

代码

/**     * Created by FussenYu on 2016/4/20.     */    public class CacheData {        public static final int recent_subject_list = 8;        /**         * 获取文件名         * @param uid 用户的id         * @param studentId 文件唯一标示         * @param type :数据类型         * @return          */         public static String getFileNameById(int type, String uid, String studentId) {             File file = new File(Config.CACHE_DATA_PATH);             if (!file.exists())             file.mkdirs();             String fileName = "cachedata_" + uid + "_" + type + "_" + studentId + ".dat";             return fileName;         }         /**         * 存储缓存文件:         */        public static void saveRecentSubList(String uid, String studentId, List<SubjectInfo> list) {            int type = recent_subject_list;            String fileName = Config.CACHE_DATA_PATH + File.separator + getFileNameById(type, uid, studentId);            File file = new File(fileName);            try {                if (!file.exists())                    file.createNewFile();                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));                oos.writeObject(list);                oos.flush();                oos.close();            } catch (FileNotFoundException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }        /**         * 读取缓存文件:         */          public static List<SubjectInfo> getRecentSubList(String uid, String studentId) {            int type = recent_subject_list;            List<SubjectInfo> resultList = new ArrayList<>();            String fileName = Config.CACHE_DATA_PATH + File.separator + getFileNameById(type, uid, studentId);            try {                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));                ArrayList<SubjectInfo> list_ext = (ArrayList<SubjectInfo>) ois.readObject();                for (SubjectInfo obj : list_ext) {                    SubjectInfo bean = obj;                    if (bean != null) {                        resultList.add(bean);                    }                }                ois.close();            } catch (Exception e) {                return resultList;            }            return resultList;        }    }

这时候你只需要调用 CacheData.saveRecentSubList(PrefHelperUtils.getInstance().getUserUid(), studentId, mData);就可以将mData用文件的形式写到本地; 你要想从本地拿取数据的话,只需要调用 List<SubjectInfo>allSubList = CacheData.getRecentSubList(PrefHelperUtils.getInstance().getUserUid(), studentId); 方法就可拿到保存到本地的集合;

说明:PrefHelperUtils.getInstance().getUserUid()是用户的id,我是用sp保存到本地的;

需要注意的问题:

如果有对象的话 那么这个对象必须实现Serializable接口,不然 不能成功!

2 1
原创粉丝点击