网络引擎与数据库相结合

news/2024/7/3 5:49:53

结合之前两篇文章链式调用打造第三方的网络引擎
http://blog.csdn.net/qq_24675479/article/details/79277616
和 自己动手搭建数据库框架
http://blog.csdn.net/qq_24675479/article/details/79285849

首先逻辑处理:每次都会请求数据,但是为了保证用户体验,我们可以先去本地拿缓存,如果本地有则先显示,然后获取到后台返回数据后,如果数据一样则不做界面刷新,如果不一致,加入缓存

  • 首先获取缓存数据和保存数据类工具类
public class CacheDataUtil {

    /**
     * 获取数据
     */
    public static String getCacheResultJson(String finalUrl) {
        final IDaoSupport<CacheData> dataDaoSupport = DaoSupportFactory.getFactory().getDao(CacheData.class);
        // 需要缓存,从数据库拿缓存,问题又来了,OkHttpEngine  BaseLibrary
        // 数据库缓存在 FrameLibrary
        List<CacheData> cacheDatas = dataDaoSupport.querySupport()
                // finalUrl http:w 报错  finalUrl -> MD5处理
                .selection("mUrlkey = ?").selectionArgs(MD5Util.string2MD5(finalUrl)).query();

        if (cacheDatas.size() != 0) {
            // 代表有数据
            CacheData cacheData = cacheDatas.get(0);
            String resultJson = cacheData.getResultJson();

            return resultJson;
        }
        return null;
    }

    /**
     * 缓存数据
     */
    public static long cacheData(String finalUrl, String resultJson) {
        final IDaoSupport<CacheData> dataDaoSupport = DaoSupportFactory.getFactory().
                getDao(CacheData.class);
        dataDaoSupport.delete("mUrlkey=?", MD5Util.string2MD5(finalUrl));
        long number = dataDaoSupport.insert(new CacheData(MD5Util.string2MD5(finalUrl), resultJson));
        Log.e("TAG", "number --> " + number);
        return number;
    }
}
  • 对数据进行缓存的实体类
public class CacheData {
    //请求链接
    public  String mUrlkey;
    //后台返回的json
    public String mResultJson;

    public CacheData() {
    }

    public CacheData(String mUrlkey, String mResultJson) {
        this.mUrlkey = mUrlkey;
        this.mResultJson = mResultJson;
    }


    public String getResultJson() {
        return mResultJson;
    }
}
  • 对OkHttpEngine进行的get方法修改
  @Override
    public void get(final boolean cache, Context context, String url, Map<String, Object> params, final EngineCallBack callBack) {
        // 请求路径  参数 + 路径代表唯一标识
        final String finalUrl = HttpUtils.jointParams(url, params);
        Log.e("Get请求路径:", finalUrl);

        // 1.判断需不需要缓存,然后判断有没有
        if (cache) {
            String resultJson = CacheDataUtil.getCacheResultJson(finalUrl);
            if (!TextUtils.isEmpty(resultJson)) {
                Log.e("TAG", "以读到缓存");
                // 需要缓存,而且数据库有缓存,直接就去执行,里面执行成功
                callBack.onSuccess(resultJson);
            }
        }

        Request.Builder requestBuilder = new Request.Builder().url(finalUrl).tag(context);
        //可以省略,默认是GET请求
        Request request = requestBuilder.build();

        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callBack.onError(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String resultJson = response.body().string();
                Log.e("TAG",resultJson);
                // 获取数据之后会执行成功方法
                if (cache) {
                    String cacheResultJson = CacheDataUtil.getCacheResultJson(finalUrl);
                    if (!TextUtils.isEmpty(resultJson)) {
                        Log.e("TAG",cacheResultJson.equals(resultJson)+"");

                        // 比对内容
                        if (resultJson.equals(cacheResultJson)) {
                            // 内容一样,不需要执行成功成功方法刷新界面
                            Log.e("数据和缓存一致:", resultJson);
                            return;
                        }
                    }
                }
                // 2.2 执行成功方法
                callBack.onSuccess(resultJson);
                Log.e("Get返回结果:", resultJson);
                if (cache) {
                    // 2.3 缓存数据
                    CacheDataUtil.cacheData(finalUrl, resultJson);
                }
            }
        });
    }

http://www.niftyadmin.cn/n/3648853.html

相关文章

css伪类选择器_如何使用CSS:root伪类选择器

css伪类选择器Learn about the CSS :root pseudo-class selector, and how you might want to use it in your projects! 了解CSS :root伪类选择器&#xff0c;以及如何在项目中使用它&#xff01; The CSS :root pseudo-class selector is used to select the highest-level …

Git使用教程详解之二 Git基础

Git 基础 读完本章你就能上手使用 Git 了。本章将介绍几个最基本的&#xff0c;也是最常用的 Git 命令&#xff0c;以后绝大多数时间里用到的也就是这几个命令。读完本章&#xff0c;你就能初始化一个新的代码仓库&#xff0c;做一些适当配置&#xff1b;开始或停止跟踪某些文件…

自定义view——实现评分控件RatingBar的实现

首先看下效果图 星星是两个不同的图片 首先老套路&#xff1a;自定义属性 <?xml version"1.0" encoding"utf-8"?> <resources><declare-styleable name"RatingBar"><attr name"starNormal" format"ref…

[C#][固定格式网页解析]使用正则表达式处理网页的初步体会

用IE WebControl解析网页得到特定网页中的特定数据&#xff1a;Set oDocument Form2.m_IE.Document Set oelement oDocument.Forms("searchdetail") Set oListTableElement oelement.children(0).children(0)这样的好处是简单&#xff0c;但坏处是&…

如何在Ubuntu 18.04上使用Apache设置密码身份验证[快速入门]

介绍 (Introduction) This tutorial will walk you through password-protecting assets on an Apache web server running on Ubuntu 18.04. Completing these steps will provide your server with additional security so that unauthorized users cannot access certain pa…

新闻组搜索技术讨论的利器

新闻组利器http://groups-beta.google.com/和http://www.google.com/advanced_group_search?hlzh-CN。尤其是前者&#xff0c;可以自定义自己喜欢的My Groups&#xff0c;My starred topics?&#xff0c;Recent groups&#xff0c;如果你有Google帐号或者Gmail帐号的话。

加载插件资源的Demo

首先了解一下Google加载资源源码 效果图 ImageView中加载src源码 final Drawable d a.getDrawable(R.styleable.ImageView_src); getDrawable源码 if (getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, value)) {if (value.type TypedValue.TYPE_ATTRIBUTE) {throw n…

Git使用教程详解之三 Git分支

Git 分支 几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作。在很多版本控制系统中&#xff0c;这是个昂贵的过程&#xff0c;常常需要创建一个源代码目录的完整副本&#xff0c;对大型项目来…