oschina-app 源码分析-数据缓存(离线功能)
来源:互联网 发布:sql身份证取年龄 编辑:程序博客网 时间:2024/05/05 04:41
以前做过数据缓存的项目,也就是实现离线操作。当时刚开始做项目,我们都没什么经验,但是缓存数据无非是数据库或者文件,但是我们选择用xml文件来存储数据,现在看来是有点走远路了,oschina-app通过实现对object的实体流读写来完成数据缓存,来看下显现流程。
1,首先在ui线程中另起线程,获取数据:
/** * 线程加载帖子数据 * * @param catalog * 分类 * @param pageIndex * 当前页数 * @param handler * 处理器 * @param action * 动作标识 */private void loadLvQuestionData(final int catalog, final int pageIndex,final Handler handler, final int action) {mHeadProgress.setVisibility(ProgressBar.VISIBLE);new Thread() {public void run() {Message msg = new Message();boolean isRefresh = false;if (action == UIHelper.LISTVIEW_ACTION_REFRESH|| action == UIHelper.LISTVIEW_ACTION_SCROLL)isRefresh = true;try {PostList list = appContext.getPostList(catalog, pageIndex,isRefresh);msg.what = list.getPageSize();msg.obj = list;} catch (AppException e) {e.printStackTrace();msg.what = -1;msg.obj = e;}msg.arg1 = action;msg.arg2 = UIHelper.LISTVIEW_DATATYPE_POST;if (curQuestionCatalog == catalog)handler.sendMessage(msg);}}.start();}
在AppContext中判断是从本地缓存取还是从网络获取:
/** * 帖子列表 * @param catalog * @param pageIndex * @return * @throws ApiException */public PostList getPostList(int catalog, int pageIndex, boolean isRefresh) throws AppException {PostList list = null;String key = "postlist_"+catalog+"_"+pageIndex+"_"+PAGE_SIZE;if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {try{list = ApiClient.getPostList(this, catalog, pageIndex, PAGE_SIZE);if(list != null && pageIndex == 0){Notice notice = list.getNotice();list.setNotice(null);list.setCacheKey(key);saveObject(list, key);list.setNotice(notice);}}catch(AppException e){list = (PostList)readObject(key);if(list == null)throw e;}} else {list = (PostList)readObject(key);if(list == null)list = new PostList();}return list;}
根据程序判断,如果是本地没有走网络获取,并缓存到本地saveObject(list, key);,有则直接读取list = (PostList)readObject(key);直接看上数据缓存和读取的代码:
/** * 保存对象 * @param ser * @param file * @throws IOException */public boolean saveObject(Serializable ser, String file) {FileOutputStream fos = null;ObjectOutputStream oos = null;try{fos = openFileOutput(file, MODE_PRIVATE);oos = new ObjectOutputStream(fos);oos.writeObject(ser);oos.flush();return true;}catch(Exception e){e.printStackTrace();return false;}finally{try {oos.close();} catch (Exception e) {}try {fos.close();} catch (Exception e) {}}}/** * 读取对象 * @param file * @return * @throws IOException */public Serializable readObject(String file){if(!isExistDataCache(file))return null;FileInputStream fis = null;ObjectInputStream ois = null;try{fis = openFileInput(file);ois = new ObjectInputStream(fis);return (Serializable)ois.readObject();}catch(FileNotFoundException e){}catch(Exception e){e.printStackTrace();//反序列化失败 - 删除缓存文件if(e instanceof InvalidClassException){File data = getFileStreamPath(file);data.delete();}}finally{try {ois.close();} catch (Exception e) {}try {fis.close();} catch (Exception e) {}}return null;}
现在看来确实很简单,只要在请求前读数据在请求后写数据就行了。
网络获取部分就不说,没什么特殊的就是HttpClient,别忘了出来各种异常就行了。
oschina-app完整源码下载:http://download.csdn.net/detail/xiangxue336/7023661
0 0
- oschina-app 源码分析-数据缓存(离线功能)
- 【oschina android源码分析】缓存的设计
- oschina-app 的源码分析-主页面滑动切换
- oschina-app源码分析-提醒标签BadgeView使用方法
- oschina-app源码分析-提醒标签BadgeView使用逻辑流程
- oschina-app源码分析-提醒标签BadgeView使用逻辑流程
- oschina源码分析:架构篇(草稿)
- oschina源码分析:实现篇(草稿)
- OSChina客户端源码学习(2)--缓存的设计
- OSChina App代码分析一
- OSChina App代码分析二
- 【oschina android源码分析】总结
- Webview离线功能(优先cache缓存+cache缓存管理)
- Webview离线功能(优先cache缓存+cache缓存管理)!
- Webview离线功能(优先cache缓存+cache缓存管理)
- Webview离线功能(优先cache缓存+cache缓存管理)!
- Webview离线功能(优先cache缓存+cache缓存管理)
- 分析开源oschina客户端的源码(一)
- 挨踢职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总
- html A标签的onclick事件和href的使用
- JSON资料整理
- 利用JAXB进行xml和javabean之间转换
- 补上一篇——Iserver 7c 发布服务
- oschina-app 源码分析-数据缓存(离线功能)
- Java 性能优化之 String 篇
- 用自己的Qt4程序成功取代友善自带的程序(取代的程序是start Qt4.7.0)(转载)
- 是呆在原来公司还是去中软国际?各位提提意见
- Android不使用USB数据线调试的方法
- hdu 1009 猫鼠交易!!c++
- Codeforces Round #232 (Div. 2) B. On Corruption and Numbers 题解
- NYOJ520 最大素因子
- php生成二维码