您的位置:首页 > 移动开发 > Android开发

如何为Android缓存数据到本地

2016-04-26 18:47 405 查看

如何为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接口,不然 不能成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: