关于荆江航道安卓日志管理项目的阶段总结 ![]() 新年玩了几天 ,今天算是玩里偷闲,呵呵 ,没事写个荆江指挥部日志系统的总结,其实一个星期多之前代码就是现在这样子,怕一不小心忘记了其中的业务逻辑。遥想电脑丢失,数据丢失,未存服务器,未存百度云,实验室荆江日志管理项目(完成度40%)6,7千行的代码的全部丢失,都没敢跟老师说,有点对不住老师,嘿嘿, 从0开始,随着设计的数据库,和存储恢复序列化对象数据测试成功的完成,除了添加hessian包的网络连接,与服务器数据交换必须在实验室做(内网环境),和闹钟的协调为完善(已完成50%)基本的功能已经完成。在此总结,估计: 8大模块:,程序总入口模块,数据库模块(基于对象序列化存储,而不是字段),万年历模块(手势滑动),日志分类列表显示模块,日志格式设计和日志序列化对象包装,日志查看与编辑模块,待办事项模块(闹钟提醒,已完成50%),网络数据交换模块(回实验室写(预留接口,回实验室弄) 文件:9个包12个java源文件 模块:40个源码文件,代码量行数:至少5000行(完成度80%居然比原来的40%的还少!从0思考更加精炼和鲁棒!!) 图片:大约40多张 时间:7个晚上,在家还是很舒服的,哎,寒假过得太快,没过几天又得去学校,老爸老妈也感觉老了不少,哎,自己还啥都不懂,写代码的晚上的时候,从冰箱来瓶牛奶补充一下体力,把自己房间门一关,呵呵,都说晚睡佳品是牛奶饼干,但是我咋感觉抗眠功力比咖啡强大多了,然后开发之旅就开始啦。 B一下:重0开始,这次有点开发的味道了,全程手写代码,原创算法,全程自己架构设计,编码,模块,代码,美工,测试,这次编码决心杜绝硬编码,采用软编码。 美工和起点: 虽说代码全丢失,但是手机里安装了原来的程序,我首先提取程序,解压APK,没错,安卓打包机制和java类似,安装程序软件本质就是个集成压缩包,根据这个我获得了原程序所有图片素材,所以表面上界面变化不大,但是实际的架构发生重大改变!!(省却美工劳动)顺便获取大量QQ,微信(汗!解压5000多张!一眼看出腾讯技术的强大),字节码原因,可以反汇编源码,不过看了qq解压的源文件,和从自己手机提取原来做的程序的源文件,加密方式不一样,不过反正懒得去学来试一下,不如直接重写快。 模块解析与技术要点: 核心:数据库模块:抛弃原线程池网络连接为核心的大错误,软件的核心是数据库里面的数据,网络只是辅助通信的手段,以前是因为实验室服务器获取数据感觉蛮,是网络连接的时候开销太大,所以采用线程池来提高效率,但是现在思考后,这个软件本身不是网络连接作为和兴,核心是数据库的存取!!!采用java23经典设计模式中的单例模式,设计为DatabaseHelper和DatabaseManager(数据库工具方法集成的封装类),经测试,采用之后,速度提升在1到2秒!!两个类桥接一起都是单例。核心:利用文件IO加序列化接口,序列化对象为二进制数据,从而进行存取。 工具:介绍一个需要root的文件管理R.E.管理器,可以查看自己的设计的数据库在data/data/程序包名,存储了db文件,就是数据库文件,可以查看存储的记录的条数:字段 ![](https://img-blog.csdn.net/20150902104734705?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![](https://img-blog.csdn.net/20150902104747584?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 设计考虑,我随机设计了一个数据包,进行模拟网络数据的传输,按照我的实验得出: 序列化对象存储数据量90KB,一共42条记录,(上述显示一半),我这样估计,每天的日志量在2KB左右,考虑我用随机数生成的数据造成每天数据量分配不均,我加2倍,日志数据大小每天6KB,一年400天计算,一共是2400KB,不足3MB,虽然序列化对象的存储比字段的存储冗余数据大,但是基于文本的日志系统而言,这点冗余不算什么!!!! 对于数据库,我逻辑上设置两张大表,一张就是一个月的日志分布的“位图”,一共32个布尔值,描述这个月每一天的日志是否拥有,另一张大是某个月某一天所拥有的所有日志信息。两个代码上大表统一对外表现为一个源文件。所以序列化对象,只需要序列化这个对象ok。 ![](https://img-blog.csdn.net/20150902104806964?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![](https://img-blog.csdn.net/20150902104811364?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![](https://img-blog.csdn.net/20150902104826615?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 万年历模块: 万年历模块,可谓行云流水,敲起来就像敲个helloworld,不足半小时搞定!万年历采用手势滑动进行月份选择,淡入淡出进行切花网格日历,对于万年年,遥想当年洋洋洒洒几百行,我还设计了闰年的计算模式,和每个月天数的计算,但是其实就是一个Calendar类解决,我们其实只需要知道这个月的第一天是星期几,这个月有多少天,我们就可以绘制出这个月的日历表。所以这次只需要不足50行搞定核心!遥想网上的所谓某些开源源码洋洋洒洒2000千行来实现这个,实际不足百行,全程搞定! ![](https://img-blog.csdn.net/20150902104843594?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![](https://img-blog.csdn.net/20150902104848001?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 日志分类列表显示模块:对日志二级排序的思考和底层实验心得 显然我们需要进行排序的原因是因为我们喜欢这样看:第一,我们对一天的日志喜欢先看多的分类,对于日志为0的分类,可以不显示。第二我们需要对这一分类的日志进行按照时间出现顺序进行排序。这也就是二级排序的模块设计,这时候我们自然很容易想到采用java集合框架中ArrayList,实现sort接口,直接排序,在这里我设计了日志的数据结构,显然,我们需要对日志进行一天出现的顺序进行排序,这个时候我们根据什么key值呢。我设计的是根据一天的小时X100+分钟,日志记录的时间粒度是分钟,这样,很容易,我们在12点10分写的日志,key值是1210,我们可以保证时间晚写的key值是大于时间早写的key值,这里体现了数据结构的作用,经典的数据结构需要时常学习,可谓博大精深,有时候我们也需要设计自己数据结构,对于这次日志管理,我设计日志格式的数据结构是以HashMap为核心封装对象,提供排序算法支持上述讨论。二级排序如下: 一级排序:![](https://img-blog.csdn.net/20150902104908957?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 二级排序: 可扩展列表的底层思考: 在调试的时候看到安卓对可扩展列表的初始化为,安卓会先生成可见列表的对象,当我们滑动显示隐藏的列表的时候,安卓在重新生成新的列表,可见安卓的效率。说明:我在初始化的时候设计的是7个列表,日志分7大类,而适配组数据的时候生成的是4个列表,因为我的手机可见范围的视图是4个列表,当我向下滑动的时候,安卓才会今儿生成生成剩下3个列表。 进一步的调试验证,安卓底层在可扩展列表的子组件生成的时候,是必须在用户实现点击组视图的时候,安卓会生成子组件,子组件有childcount决定,为0的时候不生成,例如为3会调用3次。这次,发现这点我改正了一个效率点的问题,既然调用三次,我根本不必要生成三次列表的视图和列表数据的排序!!! 日志查看与编辑模块:基于状态机的编辑模式加设计的控制面板设计和人性化的书本记录日志模式,日志记录时间的合法性提示和修正 编辑规则的制定:我设计的记事本是基于这样的3大编辑规则: 1,一个人在某个一年,某一月,某一天,某一个小时,某一分钟,只能记录某一分类的日志的一条记录,时间的粒度是分钟,不是秒钟。 2,一个人查看日志,发现需要修改,这个等价于覆盖原来的日志,我只记录最新的日志! 3,日志时间不能为空,其他都可以为空。 人性化的书本记录日志模式:点击添加日志进入添加日志界面,我设计了类似书本带下划线的记事本,加一个控制板,体现点人性化 控制面板:一共有6按钮,功能在下面用文字注释,嘿嘿,颜色也是本屌丝精心美工绘制!!!日志同意添加和查看功能,既然我们点击列表查看日志,和点击按钮添加日志是一体的,我同意一个类,利用状态机的来表示,状态标识是出于编辑状态还是查看状态,闹钟状态表示是否设置闹钟。未上传表示是否上传服务器 ![](https://img-blog.csdn.net/20150902105131358?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![](https://img-blog.csdn.net/20150902105201977?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 日志合法性检查:我们记录日志的时候时间的记录是必须的,所以时间的合法性检测很重要,我们第一时间不空,第二,时间如果月份大于12,等等,必须进行合法转化,幸运的是Calander解决了合法检测并把非法时间转化合法时间! 日志格式设计和日志序列化对象包装: 其实就是hashmap的封装:key值为:usernname,title,content,……存储的就是一个日志的所有信息,实现序列化,再添加一些工具方法,数据库存储的数据就是这些对象。 代办事项完成50%: |