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

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

先上图,看看效果:



本篇和网易新闻客户端有些类似,为了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 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) ois.readObject();
			ois.close();
			if (cacheData != null && cacheData.size() > 0) {
				// 一定要有这一句话,不然第1页不加载缓存
				if(mMemMap == null) mMemMap = new HashMap>();
				mMemMap.put(pagenum + "", cacheData);// 同时保存到内存中,下一次直接从内存到读取
				return true;
			}
			return false;
		}
		return false;
	} catch (Exception e) {
		e.printStackTrace();
	}
	return false;
}

从缓存中获取数据:

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


Demo下载点击这里




你可能感兴趣的:(Android,数据存储,内存,缓存,网络)