Android三级存储——将网络数据存储到内存和缓存
2014-09-30 17:59
567 查看
本篇讲“三级存储”(非官方称谓),即"网络—内存—缓存"这三级。如何将网络数据存储到内存、缓存(也就是文件)中,避免每一次都请求网络。
先上图,看看效果:
本篇和网易新闻客户端有些类似,为了Demo的尽可能简单,只做了如下三点处理:
1.首先加载内存数据;
2.如果内存没有数据,加载缓存数据,并将缓存数据保存到内存中,便于下一次直接从内存中读取;
3.如果缓存中没有,请求网络数据,并将数据保存到内存和缓存中(这一步看个人需求)。
下面分析代码。
一、主Activity中主要有两个方法,显示下一页和上一页。代码中没有看到handler,是因为jar包中封装了Asynctask,jar包中也封装了网络请求获取数据的类,这是为了Demo尽可能简单。
二、数据中心
数据中心类DataCenter.java负责提供数据,出来数据保存到内存、缓存和访问网络逻辑:
判断内存是否存在数据:
从内存中获取数据:
缓存中是否存在数据:
从缓存中获取数据:
Demo下载点击这里
先上图,看看效果:
本篇和网易新闻客户端有些类似,为了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下载点击这里
相关文章推荐
- Android第六讲——数据存储(五种)SharedPreferences、内部存储(缓存cache)、外部存储(Sdcrad)、SQLite数据库、网络存储
- Android 内存+文件+网络三级缓存
- Android:ListView异步加载图片(实现网络下载、存储本地、缓存内存、压缩显示)
- Android---数据读取、存储、删除(内存储/SD卡存储/网络数据读取存储)
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- Android(五)数据存储之五网络数据交互
- android中图片的三级cache策略(内存、文件、网络)之二:内存缓存策略
- Android数据存储--网络存储
- Android 图片三级缓存之内存缓存(告别软引用(SoftRefrerence)和弱引用(WeakReference))
- android中图片的三级cache策略(内存、文件、网络)之二:内存缓存策略
- android中图片的三级cache策略(内存、文件、网络)之三:文件缓存策略
- Android(五)数据存储之五网络多线程断点下载
- Android 数据存储之五网络多线程断点下载
- android中图片的三级cache策略(内存、文件、网络)之三:文件缓存策略
- Android之ListView异步加载网络图片(优化缓存机制)和对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android中图片的三级cache策略(内存、文件、网络)之二:内存缓存策略
- 理解 Android 本地数据存储 API--利用首选项、SQLite 和内部及外部内存 API
- android 数据存储和访问方式五:网络详解
- android利用http从网络获取数据并存储或解析
- Android Network网络数据存储