您的位置:首页 > 理论基础 > 计算机网络

Android三级存储——将网络数据存储到内存和缓存

2014-09-30 17:59 567 查看
本篇讲“三级存储”(非官方称谓),即"网络—内存—缓存"这三级。如何将网络数据存储到内存、缓存(也就是文件)中,避免每一次都请求网络。

先上图,看看效果:



本篇和网易新闻客户端有些类似,为了Demo的尽可能简单,只做了如下三点处理:

1.首先加载内存数据;

2.如果内存没有数据,加载缓存数据,并将缓存数据保存到内存中,便于下一次直接从内存中读取;

3.如果缓存中没有,请求网络数据,并将数据保存到内存和缓存中(这一步看个人需求)。

下面分析代码。

一、主Activity中主要有两个方法,显示下一页和上一页。代码中没有看到handler,是因为jar包中封装了Asynctask,jar包中也封装了网络请求获取数据的类,这是为了Demo尽可能简单。

/**
* 上一页
*/
private void showLastPage() {
if (--pagenum > 1) {
dataCenter.getSearchData(this, pagenum);
last_page_view.setVisibility(View.VISIBLE);
} else {
last_page_view.setVisibility(View.INVISIBLE);
dataCenter.getSearchData(this, pagenum);
}
}

/**
* 下一页
*/
private void showNextPage() {
if (++pagenum <= MAX_PAGE) {
dataCenter.getSearchData(this, pagenum);
last_page_view.setVisibility(View.VISIBLE);
} else {
-- pagenum;
Toast.makeText(this, "已经是最后一页", Toast.LENGTH_SHORT).show();
}
}


二、数据中心

数据中心类DataCenter.java负责提供数据,出来数据保存到内存、缓存和访问网络逻辑:

/**
* 获取数据
*
* @param pagenum
*            当前页码
*
* @return
*/
public void getSearchData(SearchListener listener, int pagenum) {
this.listener = listener;
this.pagenum = pagenum;
if (isExistInMemory()) {
getMemoryData(this.listener);
} else if (isExistInCache()) {
Log.e(TAG, "缓存中存在第" + pagenum + "页数据");
Log.e(TAG, "从缓存中获取第" + pagenum + "页数据");
ArrayList<SearchData> cacheData = getCache();
this.listener.onSearchCallBack(cacheData);
} else {
getNetData();
}
}


判断内存是否存在数据:

/**
* 内存中是否内在
*
* @return
*/
private boolean isExistInMemory() {
if (mMemMap != null && mMemMap.size() > 0) {
mMemDataList = mMemMap.get(pagenum + "");
if (mMemDataList == null || mMemDataList.size() == 0) {
Log.e(TAG, "内存中不存在第" + pagenum + "页数据");
return false;
} else {
Log.e(TAG, "内存中存在第" + pagenum + "页数据");
return true;
}
}
if (mMemMap == null || mMemMap.size() == 0) {
Log.e(TAG, "内存中不存在第" + pagenum + "页数据");
return false;
}
return false;
}


从内存中获取数据:

/**
* 从内存获取
*
* @param listener
*/
private void getMemoryData(final SearchListener listener) {
mMemDataList = mMemMap.get(pagenum + "");
listener.onSearchCallBack(mMemDataList);
Log.e(TAG, "从内存中读取第" + pagenum + "页数据");
}


缓存中是否存在数据:

/**
* 缓存中是否存在,如果存在,更新到页面,并保存到内存,方便下次使用
*
* @return
*/
@SuppressWarnings("unchecked")
private boolean isExistInCache() {
try {
if (fileLoader == null) {
fileLoader = FileLoader.getInstance(context);
}
String fileName = PREFIX + pagenum + SUFFIX; // 文件名
File file = fileLoader.getFile(fileName);
if (file.exists()) {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(file));
cacheData = (ArrayList<SearchData>) ois.readObject();
ois.close();
if (cacheData != null && cacheData.size() > 0) {
// 一定要有这一句话,不然第1页不加载缓存
if(mMemMap == null) mMemMap = new HashMap<String, ArrayList<SearchData>>();
mMemMap.put(pagenum + "", cacheData);// 同时保存到内存中,下一次直接从内存到读取
return true;
}
return false;
}
return false;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}


从缓存中获取数据:

/**
* 获取缓存对象,将文件中的数据反系列化
*
* @param currPage
* @return
*/
private ArrayList<SearchData> getCache() {
return cacheData;
}


Demo下载点击这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐