Android实现界面内容缓存
Posted Songlcy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android实现界面内容缓存相关的知识,希望对你有一定的参考价值。
关于缓存的话题,想必大家都耳熟能详了。对于缓存,每个人也都会有各自的见解。缓存的原理大同小异,今天就和大家唠唠在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实现缓存机制的内容就全部结束了,希望大家喜欢!
以上是关于Android实现界面内容缓存的主要内容,如果未能解决你的问题,请参考以下文章