`

最近半个月开发小结

阅读更多
1、有一个方法,有一段类似于下面这样:
new Thread(){
    public void run(){
        // 做了一些数据库操作
        db.close();
    }
}.start();

结果运行过程中,发现有时候会报数据库已经锁定的异常。最后才定位到上面这段代码。原因是在上面的run()方法中打开了数据库,这个时候会自动锁定Database,如果在关闭数据库之前,另外一个线程B也进行数据库操作,就会报这个异常。如果数据库已经关闭之后,另外一个线程B请求数据库操作,就没有问题。

所以在新线程中进行数据库操作,或者是TimerTask中进行数据库操作的时候,要注意考虑并发的问题,也许就会有数据库锁定的异常。

2、另外一段代码,将TimerTask的销毁操作放在了Service的onDestory()方法里,但是发现有时候会报TimerTask已经schedule的异常。开始就觉得很奇怪,不是已经在onDestory()方法里关闭了TimerTask了吗?后来想到,Service的onDestory()方法不是一定有机会执行的。在资源不足的时候,系统会强行关闭Service,在这种情况下,onDestory()方法是没有机会执行的。

所以,绝对不能依赖组件的onDestory()方法。

3、这次项目管理有一个失误的地方。就是在项目设计早期,没有关注数据库表设计。到了后期才来检查数据库的设计,结果发现有很多地方需要变更,这就造成建表语句、模型对象、DAO都要修改,开发和测试的成本都非常高。

所以以后一定要在早期就关注数据库设计,如果有迫不得已的数据库变更(这个几乎是难免的),也要趁早进行

4、有的时候,发现两个组员都是更新了最新的代码,可是一个能正常跑起来,另一个人就总是报错。这种情况,一般是因为数据库错误引起的,虽然是同样的代码,但是却不是同样的数据库。这种情况下,需要把旧的应用卸载,重新启动。这样就会触发SqliteDatabaseOpenHelper的onCreate()方法,重新建立一致的数据库

5、前期把整个应用的常量,都放在一个Constants类里,这样虽然避免了硬编码,但是其实由于Constants类里充斥了各种各种的常量,也失去了可维护的意义。所以如果常量太多的话,可以考虑根据模块或者业务,分散到不同的Constants类里

6、一般跳转到别的Activity,是调用startActivity()方法,不过如果需要在新Activity里做完某些操作以后,再通知原先的Activity的话,应该调用startActivityForResult()方法,然后实现onActivityResult()方法

7、有一次在DDMS里发现了has leaked window的异常告警。这种情况一般是在Activity里创建了Dialog,然后又没有及时关闭引起的。解决的办法很简单,在需要创建Dialog的地方,调用showDialog()方法,然后在Activity里实现onCreateDialog()方法,这样的话,Activity就会管理Dialog的生命周期,就不会发生上述的问题了

8、一般连接android底层的linux,用adb shell命令就可以了。但是如果同时开启了模拟器,又连接了真机,就不能这样了,必须用以下的命令:
adb devices,这个命令可以看到有哪些设备,包括了模拟器和真机
然后用adb -s (deviceId) shell,就可以连接到目标终端上

或者还有一个办法,用adb -d shell连接到设备上,用adb -e shell连接到模拟器上

9、我自己定义了一个VO类,可是用Intent.putExtra()方法竟然放不进去,原来是这个VO没有实现Serializable接口

10、项目中业务上需要很多后台长时间运行的Service,可是后来发现Service实在太多了,所以换了一个方案。把实现业务逻辑的Service,都改成用IntentService实现。只开启一个长时间后台运行的Service,在这个Service里用多个TimerTask,定时去startService()各个IntentService。这样应用就只有一个驻留Service了

11、很多Service都去实现onStart()方法,其实这是不对的,onStart()是一个遗留方法。Android2.2以上的版本,官方推荐是实现onStartCommand()方法

12、如果没有多线程的需求的话,使用IntentService替代Service是一个不错的选择。一方面不需要编码另起线程(Service默认是跑在UI Thread里的,这点相当恐怖),另一方面,也不需要显式地调用stopSelf(),或者stopService()。IntentService的问题是,如果需要并发地处理请求,则晚来的Intent只能排队

13、TimerTask比较多的话,一个最佳实践(或者是迷信)是:用3、7、11、13、17这样的素数错开运行的时间

14、一个已经调用了.cancel()方法的TimerTask,不能被再次作为Timer.schedule()的参数,需要重新实例化一个TimerTask

15、没有特别的需求的话,个人建议可以在AndroidManifest.xml里不配置intent-filter,这样就强制代码只能用显式的Intent来跳转Activity或者开启Service,不能用隐式的Intent来调用。

这种做法虽然损失了一些面向组件的灵活性,但是定位问题会比较简单。因为比较容易查出来,某个Service被哪些组件启动了,或者某个Activity可以从哪些页面跳转过来

当然,如果Activity和Service被设计为允许其他应用使用,那必须要支持隐式的Intent调用

16、数据库字段的命名,还是有点讲究的。比如在T_PERSON表里,字段就没必要再命名成PERSON_NAME,直接叫NAME就可以了,前者比较冗余。这个虽然是小问题,但是对于追求细节完美的应用来说,还是要注意的。如果前期没有注意,到项目后期再统一优化,代价会大很多

17、原来经常用getSharedPreference()方法,来获取自定义SP文件。其实发现,用PreferenceManager.getDefault()方法就可以获得一个默认的SP文件了

18、DTO和VO,建议重载toString()方法,调试会很方便

19、Activity的findViewById()方法,和View的findViewById()是不一样的。
前者一般都在onCreate()方法里调用setContentView()方法,然后findViewById()就是从这个xml文件里找ID
后者一般调用一个inflate()方法,然后findViewById()方法是从这个xml文件里找ID

所以在另一个xml文件里定义的组件,在没有引入该xml文件的Activity里,用findViewById()方法是找不到的。项目里因为这个原因,发现了几次NPE
分享到:
评论
1 楼 leiwuhen822 2011-12-15  
      

相关推荐

    java程序员总结报告

    光阴如梭,半年的工作转瞬即将成为历史,伴随着新年钟声的临近,我们依依惜别硕果 累累的 2010 年,满怀热情的...在这年终之际,现对我来公司这几个 月的时间里,总结自己所做的工作,分析在工作中的得与失,现汇报如下

    ARM 嵌入式LINUX 系统构建与驱动开发

    两个月以前,我只是看别人做,耳濡目染~~,本科学过单片机,从来没做过。我们这的技术主干做AVR和51,我就跟他们调过C语言程序。你看出来了?我是个不折不扣的菜鸟吧? 但是做这个之前我特意找了ZLG的两本书,看了...

    PHP程序开发范例宝典III

    个实例,每个实例都突出实用性,绝大部分实例都体现了PHP编程人员在实际项目开发过程中总结出的经验技巧。  《PHP程序开发范例宝典》内容充实,实例丰富,特别适于PHP编程人员和广大计算机爱好者学习开发使用,也...

    【酒店类】人力资源部工作总结与工作计划.doc

    通过渐进一年来的不断完善与改进,整体工作有了一个全面的提升,各项工作均能有序开展,针对人力资源部职能运作,从酒店人力资源总体规划—人员招聘—员工培训—员工开发、利用、留用—劳资关系处理—员工餐厅、员工...

    Struts原理、开发及项目实施

    Struts原理、开发及项目实施 Holen 2002-9-12 <br/>1、 摘要 2、 关键词 3、 Framework 4、 Struts的起源 5、 Struts工作原理 6、 Struts安装 7、 一个实例 8、 Struts优缺点...

    详解使用mpvue开发github小程序总结

    最近有点闲,想起关注已久的mpvue写小程序,所以稍微肝了半个多月写了个github版的微信小程序,已上线。现在总结一下遇到的坑。 扫码体验、 项目地址:https://github.com/cheesekun/wx-github mina坑 scroll-...

    本科计算机毕业实习日记

    半个月的实习日记 一、实习计划 3月5日:参观单位的基本设施并且通过资料和领导介绍了解单位的文化史和发展史,对单位结构和运作进行一定的了解。 3月6日:对部门的情况和运作方式进行了摸底式的了解,包括已经开始...

    本科计算机毕业实习日记+老师评语

    半个月的实习日记 一、实习计划 3月5日:参观单位的基本设施并且通过资料和领导介绍了解单位的文化史和发展史,对单位结构和运作进行一定的了解。 3月6日:对部门的情况和运作方式进行了摸底式的了解,包括已经开始...

    Java飞机大战

    游戏现在还只是半成品(只有第一关),花了一个月的时间,只用Java Swing开发的单机版飞机大战游戏,代码量大,层次结构多。其中也使用了之前自己写的基于Java swing小游戏引擎gametool,封装了鼠标键盘以及时间监听...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    这是一个用WinForm技术实现的系统,传智播客在开课的半个月就安排一个项目,体现了传智播客“项目驱动学习”的先进教学理念。 4、网页开发与JavaScript(7天) 查看案例演示 核心技术课程 HTML基础加强、css(包含...

    精通DirectX.3D图形与动画程序设计.pdf

    1.6 小结 第2章 direct3d程序设计基础 2.1 相关基础知识 2.2 direct3d体系结构 2.3 direct3d对象 2.4 direct3d设备对象 2.4.1 direct3d设备类型 2.4.2 创建direct3d设备对象 2.5 direct3d程序基本结构 . 2.6 最简单...

    基于asp.net mvc5.2.7个人博客系统程序(aspxadmin cms)下载

    如果你是软件开发人员(或者说是高级开发工程师),不屑于开发个人博客网站,那么你可以用我们现成的阅速Cms个人博客程序,你不用再花几个月或者半年的时间来开发、设计你自己的网站,你可以用节省的这些时间去做更多...

    基于JAVA的留言板管理系统的毕业设计.doc

    这个论文和系统在其上也花了我半个月的时间。我自己也知道并没有做全,做好,不 过经过这个设计,将平时了理论进行了实践,更加熟练了理论与实践知识,我也希望这 次的毕业设计能对我找工作有很大帮助。我会从这个...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    报表测试中的OLAP的报表测试

    在2月的最后一个星期,经历了半年的设计、开发、测试的报表系统进入了UAT阶段。我是这个基于OLAP技术报表系统的测试人员,从系统需求分析、设计,到后来的IT、ST,还有现在的PT,我都一直参与其中。这个报表测试系列...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 C++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 40 ...

    C++后台程序实时性能监控

    做后台程序经常会被问一句话,你的程序能撑多少人。一般官方一点的回答是这个得根据实际...但是若此接口又是十天半个月才会被触发一次,似乎事情又变的不是很严重。说到这里想起《unix编程艺术》上关于性能优化的总结:

Global site tag (gtag.js) - Google Analytics