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

Android数据缓存方案

2015-08-30 16:27 387 查看
首先判断本地是否存在json数据,如果存在,先加载json数据,然后再请求网络,如果没有直接请求网络。

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