Android数据缓存方案
2015-08-30 16:27
387 查看
首先判断本地是否存在json数据,如果存在,先加载json数据,然后再请求网络,如果没有直接请求网络。
这里json数据中的图片是个网页链接地址,需要本地有缓存才可以访问。文本数据json中的可以直接解析。
方案流程如下:
先上个sp存储工具类:
然后方案代码:
这里json数据中的图片是个网页链接地址,需要本地有缓存才可以访问。文本数据json中的可以直接解析。
方案流程如下:
先上个sp存储工具类:
CacheUtils.java public class CacheUtils { private static final String CACHE_FILE_NAME = "itheima45"; private static SharedPreferences mSharedPreferences; public static void putBoolean(Context context, String key, boolean value) { if(mSharedPreferences == null) { mSharedPreferences = context.getSharedPreferences(CACHE_FILE_NAME, Context.MODE_PRIVATE); } mSharedPreferences.edit().putBoolean(key, value).commit(); } public static boolean getBoolean(Context context, String key, boolean defValue) { if(mSharedPreferences == null) { mSharedPreferences = context.getSharedPreferences(CACHE_FILE_NAME, Context.MODE_PRIVATE); } return mSharedPreferences.getBoolean(key, defValue); } /** * 向SharedPreferences中存储一个字符串 * @param context * @param key * @param value */ public static void putString(Context context, String key, String value) { if(mSharedPreferences == null) { mSharedPreferences = context.getSharedPreferences(CACHE_FILE_NAME, Context.MODE_PRIVATE); } mSharedPreferences.edit().putString(key, value).commit(); } /** * 从SharedPreferences中取一个字符串 * @param context * @param key * @param defValue 缺省值 */ public static String getString(Context context, String key, String defValue) { if(mSharedPreferences == null) { mSharedPreferences = context.getSharedPreferences(CACHE_FILE_NAME, Context.MODE_PRIVATE); } return mSharedPreferences.getString(key, defValue); } }
然后方案代码:
public void initData() { System.out.println("新闻中心加载数据了"); tvTitle.setText("新闻"); ibMenu.setVisibility(View.VISIBLE); // 在请求网路之前, 把以前的数据取出来, 展示在界面上. String json = CacheUtils.getString(mActivity, ConstantUtils.NEWSCENTER_URL, null); if(!TextUtils.isEmpty(json)) { // 本地数据不为null, 展示到界面上 processData(json); } getDataFromNet(); } /** * 从网络获取数据 */ private void getDataFromNet() { HttpUtils httpUtils = new HttpUtils(); // RequestCallBack<T> 中的泛型是定义请求网络成功后, 返回回来的数据的类型 httpUtils.send(HttpMethod.GET, ConstantUtils.NEWSCENTER_URL, new RequestCallBack<String>() { /** * 当请求成功时回调此方法 * responseInfo 请求结果信息 */ @Override public void onSuccess(ResponseInfo<String> responseInfo) { System.out.println("新闻中心页面数据请求成功, 数据: " + responseInfo.result); // 把数据缓存到本地, 为了下次打开程序去显示历史的数据 CacheUtils.putString(mActivity, ConstantUtils.NEWSCENTER_URL, responseInfo.result); processData(responseInfo.result); } /** * 当请求失败时回调此方法 * msg 错误信息 */ @Override public void onFailure(HttpException error, String msg) { System.out.println("新闻中心页面数据请求失败, 错误: " + msg); } }); } /** * 处理和解析数据 * @param result */ protected void processData(String json) { Gson gson = new Gson(); NewsCenterBean bean = gson.fromJson(json, NewsCenterBean.class); // 初始化左侧菜单的数据 leftMenuDataList = bean.data; // 左侧菜单的数据 // 初始化左侧菜单对应的页面, 共四个页面: 新闻, 专题, 组图, 互动 pagerList = new ArrayList<MenuDetailBasePager>(); pagerList.add(new NewsMenuDetailPager(mActivity, leftMenuDataList.get(0)));//左侧菜单新闻页面的数据 pagerList.add(new TopicMenuDetailPager(mActivity)); pagerList.add(new PhotosMenuDetailPager(mActivity)); pagerList.add(new InteractMenuDetailPager(mActivity)); // 把左侧菜单数据传递给LeftMenuFragment来处理 MainUI mainUI = ((MainUI) mActivity); LeftMenuFragment leftMenuFragment = mainUI.getLeftMenuFragment(); leftMenuFragment.setMenuDataList(leftMenuDataList); }
相关文章推荐
- 我总结的Android编程规范
- Android-手势识别(自定义手势识别:四种自定义手势)
- Android常用加密算法比较
- Activity的启动模式
- 转发离线安装 Android Studio 更新
- Android(java)学习笔记203:网页源码查看器(Handler消息机制)
- DES的加密与解密(可逆)
- Android视频教程分享
- Android Listview横向滑动
- android服务调用
- Android -- RecyclerView的使用
- Android Studio 安装后无法打开的问题
- Android-手势识别(普通手势识别:上 下 左 右 ;自定义手势识别:对号,错号 等)
- C#客户端与Android服务端的Socket通信
- Android--Toast使用介绍
- Android应用程序用户界面(六)
- Android帮助文档本地打开慢的解决方案
- android 中 系统日期时间的获取
- adb uninstall卸载apk文件说明
- 在 Android 中 Intent 的概念及应用