如何为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接口,不然 不能成功!相关文章推荐
- 解决Android TextView默认的padding问题
- Android进阶之Property Animator研究
- Android布局文件参数layout_alignTop的作用
- 加快Android编译速度
- Android模拟器修改hosts
- Android 监听ScrollView的滑动
- Android模拟器修改host
- (4.6.11.2)Android LayoutCast 初探
- android:ellipsize="end" + android:maxLines="" 失败的原因与解决方案
- Android绘制流程
- (4.6.11.1)加快Android编译速度:Buck,LayoutCast,JRebel,Jimulabs,Instant Run
- android 控件 下拉刷新 android-pulltorefresh
- 集成融云Android SDK实现在群聊/讨论组中@人的功能(三)
- Android Studio项目开发实用快捷键!!
- Android中关于保留小数点位数的处理
- Android学习路线总结,绝对干货
- Android学习路线总结,绝对干货
- Android SDK Manager更新报错——Download interrupted URL not found
- Android meta-data
- Android---多级树形菜单的实现