Android数据缓存方案

首先判断本地是否存在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);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值