[置顶] Android实现界面内容缓存

标签: 数据库 缓存机制 android android开发
3192人阅读 评论(2) 收藏 举报
分类:

关于缓存的话题,想必大家都耳熟能详了。对于缓存,每个人也都会有各自的见解。缓存的原理大同小异,今天就和大家唠唠在Android中如何将界面中的内容进行缓存。

本篇博客将围绕如何使用SQLite数据库对数据进行缓存。

关于缓存机制的流程不多说了,大家也都清楚,我将流程以伪代码的方式直接贴出:

if(有网络) {


if(有缓存 && 缓存时间没有过期) {

getCacheContent--->取出缓存的内容

showContent();---->显示缓存的内容:例如List显示到ListView

} else {

presenter.loadData();--->请求服务器拉取数据

}


} else {


//没有网络的情况下

if(有缓存) {

getCacheContent--->取出缓存的内容

showContent();---->显示缓存的内容:例如List显示到ListView

} else {

showNetErrorView();--->显示无网络界面

}

}


上面就是缓存的伪代码。相信大家都能看懂。其实原理很简单,就是根据有无网络的情况来处理:

1.有网络:

(1)有缓存,并且缓存没有过期取缓存的数据。

(2)没有缓存或者缓存过期了,直接请求服务器拉取新数据。

2.无网络:

(1)有缓存。

(2)显示网络错误提示界面。

缓存的基本流程说完了,接下来我们来看下在实际开发中如何去处理。

1.创建SQLite数据库。我们来看核心代码

/**
 * Created by Song on 2016/3/27.
 */
public class SQLiteDataHelper extends SQLiteOpenHelper{

    private static SQLiteDataHelper instance;
    public static SQLiteDataHelper getInstance(Context context) {
        if(instance == null) {
            synchronized (SQLiteDataHelper.class) {
                if(instance == null) {
                    instance = new SQLiteDataHelper(context);
                }
            }
        }

        return instance;
    }
创建SQLiteOpenHelper并实现单例模式。

2.创建表

一般我们缓存大致分为以下几个字段:缓存时间,缓存内容,缓存的内容标示,缓存标示我们一般用请求的URL作为唯一内容标示。

public static final String CREATE_CACHE_TABLE_SQL =
        "CREATE TABLE " + TABLE_CACHE_NAME + "(" +
                CACHE_ID +" integer primary key autoincrement," +
                CACHE_URL +" TEXT,"+
                CACHE_TIME +" TEXT," +
                CACHE_CONTENT +" TEXT)";
3.根据我们上面定义的流程,我们需要4个方法:

(1)是否缓存

(2)缓存数据

(3)获取缓存数据

(4)缓存是否过期

4.分别实现上面的4个方法:

(1)是否缓存:

判断是否缓存,我们只需要根据URL去数据库查询是否有该项的内容存在,如果cursor的count == 0,即表明数据库还没有缓存该URL所对应的内容。

(2)缓存数据

缓存数据的时候,要分两种情况:

1>该URL所对应的内容已经缓存过,那么我们需要去更新已经缓存的内容,即执行UPDATE操作。

2>第一次缓存,那么我们直接执行INSERT,将数据添加到数据库即可。

(3)获取缓存数据

获取缓存数据,我们只需要根据URL去查询对应的缓存内容即可。即执行SELECT操作。

(4)缓存是否过期

在缓存数据的时候,我们会保存缓存时的时间。判断缓存是否过期,我们只需要取出缓存的时间与当前时间相比较,如果间隔了某一个时间(例如一小时),那么我们就让其作为过期数据。

OK,到这里,基本的缓存流程已经全部完毕了。大家现在是不是对缓存已经了如指掌了!下面,我们说几个需要注意的地方:

(1)操作Cursor完毕后,调用close()关闭,以免浪费内存资源。

(2)SQLiteOpenHelper创建的实例,需要一个Context。我们在传入时,尽量使用ApplicationContext。避免引起内存泄漏的问题。

好啦,关于Android实现缓存机制的内容就全部结束了,希望大家喜欢!


查看评论

缓存redis,消息队列rabbitmq

redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string、list、set、zset和hash。为了保证效率,数据都是缓存在内存中。 redis的出现,在部分场合可以对关系数据库起到很好的补充作用。 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
  • 2017年03月03日 18:28

Android 简单实现缓存机制

Android 简单实现缓存机制(反射和数据库) 标签: 数据库android缓存机制反射动态规划 2017-03-14 15:05 329人阅读 评论(2) 收藏 举报 本文章已收录...
  • asd8635938
  • asd8635938
  • 2017-03-31 14:53:36
  • 1595

Android进阶之缓存机制与实现

1 问题描述1.1 问题  在正常情况下进入app首页后,图片加载完成,接着退出app;然后断开网络,再进入app首页,页面显示空白。为什么?1.1 问题  Android开发本质上就是手机和互联网中...
  • chenliguan
  • chenliguan
  • 2016-08-25 11:50:37
  • 6527

Android缓存机制&一个缓存框架推荐

1、先推荐一个轻量级缓存框架——ACache(ASimpleCache) ACache介绍: ACache类似于SharedPreferences,但是比SharedPreferences功能更加强大...
  • shakespeare001
  • shakespeare001
  • 2016-06-17 07:53:12
  • 43817

Android 简单实现缓存机制(反射和数据库)

Android 简单实现缓存机制(反射和数据库)  现在的app每个页面都有从服务器后台拿的数据,数据基本是以文本形式返回的,大多数是json格式(json是一种文本形式的文本,跟xml一样,赋予了一...
  • hnsugar
  • hnsugar
  • 2017-03-14 15:05:08
  • 12854

android导航页面缓存

  • 2014年05月25日 19:00
  • 3.27MB
  • 下载

Android记录20-获取缓存大小和清除缓存功能

Android开发记录20-获取缓存大小和清除缓存功能 本篇博客要给大家分享的如何获取应用缓存的大小和清除缓存的功能,我们知道我们应用当中经常会产生一些数据,比如图片的缓存,数据库文件,配置文件等等。...
  • wwj_748
  • wwj_748
  • 2015-01-15 19:18:23
  • 57364

Android UI开发第十五篇——分享一个登录缓冲界面

今天在网上发现了一个很漂亮的缓冲界面,在这里分享一下。主要还是用的android Anim。java code:public class Main extends Activity { privat...
  • xyz_lmn
  • xyz_lmn
  • 2011-10-27 21:21:01
  • 12213

安卓相关内容整理

最近一直在跟安卓的各种设备打交道,主要是unity和原生安卓平台交互,硬件检测,调试相关的内容,整理一下最近遇到的问题,持续更新。主要是一些简单的解决方案以及参考链接,方便自己以及遇到相同问题的朋友们...
  • puppet_master
  • puppet_master
  • 2017-01-22 21:39:53
  • 459

Activity页面状态保存 持久化

本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用...
  • LANG791534167
  • LANG791534167
  • 2014-08-13 22:23:02
  • 1874
    个人资料
    专栏达人
    等级:
    访问量: 54万+
    积分: 6265
    排名: 4933
    博客专栏
    最新评论
    关于我