五月底做完了,一直没有时间写篇总结,还是有必要记录一下。
研一刚入学时每位同学需要组队(3-4人),合作完成一个选定的软件项目,在研一结束时需要项目答辩,所以也就是在这之前需要完成项目。
我们组的项目是Spray社交软件,Spray汉语意思“喷雾; 浪花; 喷雾器;”,功能要实现的就是这个意思,只要A,B,C用户的手机上都安装了SprayApp,且A,B,C都对篮球感兴趣,则A的篮球消息会自动发送给B,C,这是当初老师和我们说的构想和功能,我们那时太“天真”,想来想去,组内讨论,还是决定开发一款类似QQ,微信的App,同时实现自动转发的功能。
现在回头来看,当初选的这个Spray真傻,那时还是“Too young too simple”,以为一个简单的聊天软件很简单,做个后台,做几个界面就不搞定了吗,呵呵,原因很简单,因为我们使用QQ,微信很简单,所以觉得开发一款类似的也很简单,这是一个多么严重的错误!!!
先来说一下后台,第一次时决定用openfire和xmpp,觉得有了这两个,IM的功能都能很快很简单实现,还是太“天真”,网上关于openfire,xmpp的资料不多,说的全是功能和协议那些,源码很少,下载了看不懂,好纠结。在图书馆网站上按主题名检索xmpp只有《XMPP高级编程:使用JavaScript和jQuery》这一本书,显然不是android开发类的,检索openfire竟然没有结果,就检索android开发,一本一本的看目录,检索到一本却还没上架,后期又查了这本,三本都已被借走,还的日期还有很久。
第二次时组长说用SSH(web的三大框架)做后台,可是我真不知道android客户端能否通过SSH对数据库进行交互,后期他的Mysql数据库出了问题,又重装系统.......
第三次时决定用socket,这样应该可以,百度资料和源码,测试了简单功能,可是发送消息时一直有问题,去图书馆借了三本书,看了socket编程也就那样,客户端的端口号和服务器端的端口号要一致,同时在客户端建立socket连接的参数还需要服务器的IP地址,测试了发送消息还是有问题。while的true循环和发送按钮的点击事件一直没有调试好....
第四次还是决定用servlet,部署在Tomcat上,再访问数据库。当然这个工作量有些大,没有协议,都要自己定义好各种格式。
到了4月底项目还没啥明显进展,有些着急了,开发步入正轨。先来说一下遇到的一些问题,当然一开始这些都是不小的问题,花了好几天很多次调试才能解决,现在觉得也就那样了。
第一个问题:注册时把手机端数据通过Tomcat写到Mysql,这个功能一开始觉得很牛,一直不明白是什么过程写到数据库,其实用Servlet很简单,先接收数据,然后处理后写到Mysql中,下次登录时再这样进行验证,存在且正确即登录成功。
第二次问题:怎么把注册时选中的头像传递到服务器的文件夹里面,而不是直接保存在Mysql的Blob类型字段里,这个才是有难度的问题!当然传递使用post方法和outstream,服务器端收到流后再解析保存为图片格式。
第三个问题:我搜索好友时,显示一个列表,每一行包含头像,昵称信息,这个用起来很简单,可是真的开发时却花费了很多时间,先定义一个类包含Bitmap和Sting参数,还有get,set方法,再定义一个Adapter,继承BaseAdapter,然后再在包含ListView的类中实现。
第四个问题:有没有想过第三个问题中的图片是从哪里来的?这也是一个有些难的问题,显示的图片是从服务器的文件夹里获取的,收到手机端请求后,服务器输出Base64编码的流,到手机端再Base64解码,再生成Bitmap的对象,最后才能显示到那个好友搜索结果里,呵呵,我们的一个简单的操作,竟做了那么多处理。
第五个问题:使用AlarmManager定时操作Service,每1.5s检查一次消息,有消息就显示到对应的消息列表里,并显示未读消息数目或者直接显示到对话界面。当然这个逻辑真的很复杂,因为搜索到好友后,只要发了消息,会自动成为好友,没有好友验证的过程。具体逻辑有多么复杂,可以简单的想一下:1 对话表只能插入一次对方信息,好友表只能插入一次好友信息;2 他在好友表里,但不一定在对话表里;3给他发消息时他可能在跟你聊天可能没有在跟你聊天可能跟谁都没有聊天可能没有打开App,可能好友表里对话表都有你,可能对话表里没你,好友表里有你,可能好友表里没你当然对话表里也没你了,每种可能下都对应不同的操作,结果就是要么把消息显示到对话界面中,要么插入好友表且插入对话表,要么只插入对话表,且要显示未读消息数目,而且打开这个对话时优先显示未读消息,再显示之后的消息。
现在支持发送文字,至于发送文件(包括10M以内的照片、各种文件,不包括语音和视频)的方法已经知道是什么样的过程,不过不想继续花时间了,因为在这上面花的时间已经很多,还有其他的很多事要干。
当然这个App也有bug,调试了很久,还是没有解决,觉得目前能力有限吧,以后技术提高了再好好修改下。
千万不要以为项目听起来简单,开发起来就简单;某样东西使用简单,说明内部复杂,某样东西使用有些复杂,说明内部很复杂!
好几个夜晚都是凌晨两三点才睡,当然付出了就会有回报,还是有一些进步,对Servlet做后台更加熟悉,对Andorid开发也越来越能驾驭,谨以此文纪念逝去的敲击代码的时光!