【oschina android源码分析】便笺系统的设计
来源:互联网 发布:编程显示九九乘法表 编辑:程序博客网 时间:2024/05/21 00:52
本地采用的是数据库的存储方式
在便笺页面,初始化的时候,网络请求时,如果用户登录,会执行以下方法
controller.doSynchronize(aty, new SynchronizeListener() { @Override public void onSuccess(byte[] arg2) { NotebookDataList dataList = XmlUtils.toBean( NotebookDataList.class, arg2); if (dataList != null && dataList.getList() != null) { noteDb.reset(dataList.getList()); datas = noteDb.query(); adapter.refurbishData(datas); updateEmptyView(); } setSwipeRefreshLoadedState(); } @Override public void onFailure() { AppContext.showToast("网络不好,请稍后执行同步"); setSwipeRefreshLoadedState(); } });
具体的同步代码:
原理大概是:去数据库中的数据,拼成json字符串上传服务器。
/** * 一个文件云同步解决方案(便签同步) * * @author kymjs (https://github.com/kymjs) */public class SynchronizeController { public interface SynchronizeListener { public void onSuccess(byte[] arg2); public void onFailure(); } private NoteDatabase noteDb; private List<NotebookData> localDatas; private Activity aty; private static long sPreviousRefreshTime = 0; // 为了流浪考虑,不能刷新过于频繁 public void doSynchronize(Activity aty, SynchronizeListener cb) { noteDb = new NoteDatabase(aty); localDatas = noteDb.query(); this.aty = aty; // 同步逻辑太麻烦,要么用二重循环由客户端判断差异文件,要么浪费流量把本地文件全部上传交由服务器判断。 // 这里我采用两种逻辑:WiFi环境下客户端直接提交全部文件,交由服务器判断。 // GPRS环境下客户端判断差异文件,并编辑服务器端文件达到同步 if (SystemTool.isWiFi(aty)) { doSynchronizeWithWIFI(cb); } else { doSynchronizeWithWIFI(cb); } } /** * GPRS环境下:使用二重循环遍历差异文件并更新云端文件达到同步 */ private void doSynchronizeWithGPRS() { } /** * WIFI环境下:客户端直接提交全部文件,交由服务器做同步判断<br> * 由于量可能会比较大,采用json传输,而不是from * * @author kymjs (https://github.com/kymjs) */ private void doSynchronizeWithWIFI(final SynchronizeListener cb) { long currentTime = System.currentTimeMillis(); // 为流量和服务器考虑,限制请求频率,一分钟刷新一次 if (currentTime - sPreviousRefreshTime < 60000) { return; } else { // sPreviousRefreshTime = currentTime; } int uid = AppContext.getInstance().getLoginUid(); StringBuilder jsonData = new StringBuilder(); int size = localDatas.size(); jsonData.append("{\"uid\":").append(uid).append(",\"stickys\":["); boolean isFirst = true; for (int i = 0; i < size; i++) { NotebookData data = localDatas.get(i); if (isFirst) { isFirst = false; } else { jsonData.append(","); } jsonData.append("{"); jsonData.append("\"id\":").append(data.getId()).append(","); jsonData.append("\"iid\":").append(data.getIid()).append(","); String content = data.getContent(); content.replaceAll("\"", "\\\""); jsonData.append("\"content\":\"").append(content).append("\","); jsonData.append("\"color\":\"").append(data.getColorText()) .append("\","); if (StringUtils.isEmpty(data.getServerUpdateTime())) { data.setServerUpdateTime(StringUtils .getDataTime("yyyy-MM-dd HH:mm:ss")); } jsonData.append("\"createtime\":\"") .append(data.getServerUpdateTime()).append("\","); jsonData.append("\"updatetime\":\"").append( data.getServerUpdateTime()); jsonData.append("\"}"); } jsonData.append("]}"); KJLoger.debug("==" + jsonData.toString()); AsyncHttpClient client = ApiHttpClient.getHttpClient(); client.addHeader("Content-Type", "application/json; charset=UTF-8"); client.post( aty, ApiHttpClient .getAbsoluteApiUrl("action/api/team_stickynote_batch_update"), new StringEntity(jsonData.toString(), HTTP.UTF_8), "application/json; charset=UTF-8", new AsyncHttpResponseHandler() { @Override public void onSuccess(int arg0, Header[] arg1, byte[] arg2) { KJLoger.debug("获取便签:" + new String(arg2)); cb.onSuccess(arg2); } @Override public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) { cb.onFailure(); } }); ApiHttpClient.setHttpClient(client); }}
0 0
- 【oschina android源码分析】便笺系统的设计
- 【oschina android源码分析】缓存的设计
- 【oschina android源码分析】登陆和退出的设计
- 【oschina android源码分析】下载更新新版本的设计
- 【oschina android源码分析】聊天页面(私信)的设计
- 【oschina android源码分析】页面通知(站内信)的设计-android轮询方案
- 【oschina android源码分析】总结
- oschina的android源码分析学习(一)
- oschina的android源码分析学习-MainActivity
- 【oschina android源码分析】切换夜间模式的实现
- 便笺设计
- OSChina Android 客户端源码
- OSChina客户端源码学习(2)--缓存的设计
- oschina-app 的源码分析-主页面滑动切换
- 分析开源oschina客户端的源码(一)
- android 系统源码分析
- Android系统源码分析-bitmap的加载
- OSChina 的全局过滤器源码
- 程序员练级之路 (作者:陈皓)
- Android 多个Edittext不为空,Button才可点击的方法
- 【oschina android源码分析】下载更新新版本的设计
- CSS中height:100%和height:inherit的异同
- windows 下安装RabbitMQ
- 【oschina android源码分析】便笺系统的设计
- 逆波兰表达式
- USB调试不能弹出授权窗口 unauthorized 的解决办法
- LAN中访问其它主机的jupyter/ipython
- 【oschina android源码分析】聊天页面(私信)的设计
- 一个用来判断是长按手势的辅助类
- 【oschina android源码分析】总结
- 计算机图形学(二)输出图元_12_OpenGL顶点数组
- 【android】ImageView的src和background的区别以及两者的妙用