公司散伙了,总结一下(二)

早上5点自然醒,写下第一篇总结,引来很多人的关注,一些人跟我要github上的源码,非常的抱歉啊,虽然公司解散了,但那些资产还是需要保密的,于情于理都不能公开给大家;不过附上我的Github帐号 https://github.com/SwordBearer,互粉吧
;)  ,在接手这款即时通讯开发后,个人还是学到了很多东西,欢迎一起来交流交流。

现在从开发层面说说自己遇到的事吧,3月份接手这个项目,还有另外一位同事(比我早毕业一年),我们两个人一起开发。如果叫我一句话介绍当时对这项目的感觉,那只有三个字:一坨屎。 Android项目初期就是几个新手在做,从一开始就没有个好底子,随后又经手了四五拨人,往上不断堆积,给整个项目积攒了无数问题:

1.这几拨人最大的共同点就是:几乎不写注释!,代码干干净净!不多一行也不少一行!

2.命名不规范,甚至Socket接口和包名,类名都不对应,连英文都有拼错的,所有Fragment都写成Flagment,这样一两处倒还好,关键是太多了。

以上两个问题随之带来的结果就是出了BUG后,只能连猜带读去解决;可我觉得这都是一个程序猿最基本的常识啊,写规范注释,规范命名;

3.对于第三方库的引用问题,以前的代码中,凡是用到第三方库,尤其是UI的,基本上是把整个项目代码都copy进主项目,顺带把一些文件前面的注释都去了,并不是通过库引用方式来使用,所以谁加进来的UI控件,别人基本上不知道怎么用,因为没有文档。连最核心的WebSocket网络连接代码,也是从Github上扒下来,然后塞进去,不加注释,这就造成另外一个极其严重的问题,下文再述;

细细想想,这半年基本上都是在替人擦屁股,不过在重构整个项目的过程中,还是学到了很多的东西,尤其是在性能和Socket连接上,收获颇多;

Android性能存在很多问题,内存占用大,点击响应慢,数据库读写慢,UI绘制慢等等,接下来一一分析一下;

项目中有用到一个标题栏,所有页面中都会出现,原来项目中,是定义了一个无比复杂的自定义控件,有左侧返回按钮,右侧点击按钮,中间标题,以及进度条等等,所有页面用这一个控件,由于使用了这个标题栏,所有Activity的XML布局中就多了一层。这个标题栏内部又嵌套好几层,而大多标题栏只有左侧返回按钮和中间标题栏,剩余的那些控件就隐藏起来,这样够凶残吧,过度封装害死人。如何改进?我想大家都知道——ActionBar,移除原来所有的自定义标题栏,布局中减少了层次,并且ActionBar扩展性更高,可以显示更多的操作,我没有测试这个改进会有多少ms的提升,但是一定会更快。

好多ListAdapter没有使用复用原理!

有两个问题着重说一下,一个是数据库优化,另外一个是Socket连接问题;

一,数据库优化

app中有一个场景是更新一系列联系人,测试数据是780条(还包括112个分组,分组下的联系人总共有780条),当数据变化后,需要将原来的联系人删除,先保存分组到分组表,再将这780条插入联系人表。当时就在这一块总是出现数据丢失的情况,一部分联系人没有保存,这是一个很严重的问题。问题就出在SQLite连续插入的地方,原代码是如何插入的呢?数据库打开,遍历插入,然后关闭,最原始最简单的方法,可是测试了一下,光780条数据,用时20s,很恐怖的结果,20s,一段广告都看完了。

所以这就演变成了一个很常见的问题:如何在SQLite中一次性插入大量数据?

方法1,开启事务,这是必须要做的,在for循环外开启事务,循环中插入数据,循环结束关闭事务。这样写了之后,20s立马变成了4s,当时就震精了。原因:事务是在内存中进行处理,当所有插入完成后,再一次性写入数据库,每一次写入都是一次 IO操作,SQLite是个性能很低的数据库,听闻比文件操作的速度慢10倍左右(没有具体进行比较过)。

方法2,使用SqliteStatement,使用后效果杠杠的,至于为什么,可以参考这里 http://liuzhichao.com/p/1664.html ;

讲方法1和方法2结合使用后(最外层开启事务,然后使用SqliteStatement操作,最后关闭事务),效果如何呢? 20s直接降到 1s 左右!而且1s 完全可以接受了;

二,Socket连接问题

做过即时通讯的人都知道(当然我还是门外汉),客户端需要一直保持一个socket长连接,并且要一直发送心跳来维护这个长连接,如果中断了,需要重新请求连接。

我们的socket连接是放在一个单独的thread里面去实现数据请求和接收的,这个设计本身其实是有问题的。首先,Android这种平台,对内存占用非常敏感,后台的线程一不留神就会被系统kill掉,这就是我们为什么一直断网的最终原因;其次,socket长连接算是这个应用中最低层,最核心的部分,所有的数据接收发送最终都是在这里处理,不应该将它仅仅用一个线程来处理,不然在通讯过程中,遇到诸如锁屏,网络中断,后台运行等都有问题,当初在重构的时候是把它放在了一个Service里面,然后对socket在进行定时心跳维护等等,此处涉及的比较多,就不展开了。

经历这个项目之后,我就在想,如何才能构建一个高性能的Android架构呢?看过INFOQ上分享的微信开发过程 点击打开链接 ,着实让人膜拜,一个庞大的系统,也是一点点积累起来的,技术,就是这么纯粹,只需要时间和耐心去打磨而已。

说多了都是泪,公司倒了,项目停了,心里却留下了一大段空白,有对技术的,也有对创业的,以后慢慢再叙述吧.........

时间: 2024-10-22 17:49:34

公司散伙了,总结一下(二)的相关文章

公司散伙了,总结一下(一)

上周日听闻公司合伙人打来电话,说散伙了,一听就懵了,好半天才反应过来,工作生涯中头一次遇到这事,第一反应就是"公司怎么了?". 当然,我并不是公司合伙人,仅仅是16人团队中的一个Android工程师,断断续续加班了三个月,本以为Android客户端可以大踏步了,却突然终止掉. 公司只有一个产品,是做即时通讯的,这是我毕业后的第二份工作,今年3月底来这个公司,待到现在,总共6个月,一切刚刚成形却又被迫终止. "公司怎么了?" "没钱了",其中一个合

Java公司面试题集锦(二)

如有错误,望各位指正 本人会做更新 51.类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断: try { throw new ExampleB("b") } catch(ExampleA e){ System.out.println("ExampleA"); } catch(Exception e){ System.out.println("Exception"); } 请问执行此段代码的输出是什

Java模拟公司置办货物系统(二)

採用MVC风格,将数据写入文件,模拟公司置办货物系统.? A类表示普通员工,B类表示部门精力,C类表示採购部,D类表示资源管理部. 订单状态 1.表示申请状态 2.表示通过审批 3.表示未通过审批 4.表示订单完毕,购物完毕 第三步:创建Po类,代表採购部批准的订单类. package com.jereh14; public class Po implements java.io.Serializable{ public int getPor_no() { return por_no; } pu

140507公司散伙了,还是有点忧伤

虽然有心里准备,不过失业了还是会有点忧伤,而我还想等一等再找工作,人生啊,还真是无常,小小忧伤,看着办吧....

我的编程之路(二十一) 规范

不知不觉一周就过去了,这周细想真的没有做成什么,因为几乎都是做了改,改了做··· 1.代码规范 以前自认为自己很注重代码规范,但是没有想到自己项目组的开发会将代码规范审查的那么严谨,这突然让我想到之前说到程序员都喜欢追求完美,都喜欢自己和自己的风格一致,否则就会觉得别扭,不过与此不同,这是团队开发,代码规范是为了统一风格,便于别人的阅读与后人的修改与维护,虽然因为这我前前后后改了三次dao层的代码,一是要用公司封装的借口,二是要把异常处理都放在这一层或者service层,三是要用公司自己写的工具

这五件事,二次SaaS创业的老炮儿都在做(转)

在我看来,我们现在正处在SaaS公司发展过程中的第三代.第一代SaaS公司有Salesforce.Netsuite和Webex等.紧接着兴起的第二代SaaS公司大多都是利用Salesforce或其他网络平台或或范式进行规模化扩张. 如今,每一项商业流程都被网络化了.几年前规模还非常小的市场如今已经开始爆发,几年前没有SaaS产品购买预算的公司如今也开始在SaaS产品上进行大笔投入. 伴随第三代SaaS公司而来的是二次SaaS创业者的兴起.我这里所说的二次SaaS创业者并不是那些第一次SaaS创业

(转)公司上市的利弊浅谈

公司上市的利弊 公司上市是不少企业家的梦想和目标,但是,任何事都是利弊共存,只有充分认识它,才能正确把握权衡,引领企业健康发展. 一 公司上市的积极作用 1.实现原始投资人的价值提升: 从世界上的富翁排行榜,到中国的富翁排行榜,那些跻身排行榜中的富人,都有一个共同点,就是他们的资产大部分是上市公司的股票. 企业一旦实现上市,就可以给原始投资人带来双重收益. 第一收益是账面收益. 第二是原始投资人转让股票等方式带来的收益. 2.低成本融资 企业的发展需要充足的资本,因此,如何获得资本就成为企业家思

javaScript生成二维码(改造jquery.qrcode.js,使之支持中文,能带logo)

最近公司要求使用javaScript生成二维码,在网上搜了很多相关的资料,都不是很全面,俗话说:自己动手,丰衣足食. (这里吐槽下,有网友有了解决方案,却刻意把源代码压缩了,导致不知道改了什么东西,知识大家一起学习嘛,授人与鱼不如授人与渔!) 总结如下: 资料搜索 选择star最多的两个 第一个就是用的比较多的jquery.qrcode.js(但不支持中文,不能带logo)啦,第二个支持ie6+,支持中文,根据第二个源代码,使得,jquery.qrcode.js,支持中文. 支持中文 1 //q

二维码防伪标签制作印刷 防伪系统开发

二维码防伪标签制作印刷防伪系统开发--(何 188.264.66502)我们不仅可以印刷二维码标签,还可以为您定制防伪系统.下面就给大家来说说防伪标怎么做.不知道大家在购买产品的时候有没有形成一个习惯,就是查看产品上有没有防伪标签或者防伪技术产品,大部分消费者在选择产品之前的时候会优先考虑这一点. 防伪标签在我们心里就是代表正规产品,产品有保障,厂家有这个实力来做,虽然说没有防伪标签的产品也不一定是假的,但是总是无形中形成这样一个思维习惯,而且有时候选择的时候会考虑这个产品的防伪标签查询系统是哪