1、创建了一个对象后:
(1)没有在适当的地方释放掉
(2)在应该释放的地方没有做释放操作
例如:下面一段程序:
m_progressDlg = ProgressDialog.show(this, getString(R.string.market),getString(R.string.is_visiting), true);
new Thread() {
public void run() {
boolean downloadOver = downloadwidgetInfo();
if (downloadOver) {
if(null != m_progressDlg)
m_progressDlg.dismiss();//该释放这个对象,如果不释放,应用会很容易出错。
if(flag)
startIntent();
finish();
} else {
Message msg = mHandler.obtainMessage(mUphoneMain.Download_Fail);
mHandler.sendMessage(msg);
}
}
}.start();
上面一段代码的隐患就在于else中没有释放progressDlg对象。如果程序一旦出错,就会导致该progressDlg一直显示在屏幕上,使应用程序死在这个界面上。
2、逻辑上严重错误:
(1)如果一个activity是在应用程序中处于过渡的作用,例如主要做一些下载等工作。那么在这个activity中最好不要用Dialog相关的程序。如果有,这样会导致一旦此activity在联网或者做某些事情导致异常的时候,就会发出致命错误。因为容易出现这样一QQ名字种情况:就是在应用程序挂掉的同时,通知了Dialog去在这个activity之上显示一个Dialog。因为程序挂掉了,所以这个dialog就没有了activity上下文Context的载体。
例如:有三个activity如下:
activity1:入口
activity2:过渡,负责下载网络数据,如果下载失败,就跳出dialog报错。如果成功就进入activity3.
activity3:
上面这个例子就会出现这种情况:activity2由于系统突然的异常但又突然的恢复后,有可能造成的activity2链接网络部分出现致命错误而被dalvic虚拟机kill掉activity2.而此时你的程序有可能捕获了异常,并将发送消息来启动一个异常dialog的提示框。因为dialog的Context上下文事activity2,但是activity2此时被killed了。从而出现应用程序的异常终止。
(2)在new一个Thread的时候,要特别注意这个Thread是否能被控制,或者是否要去控制。特别是在多个线程启动的时候,在android上很难像写java应用程序一样很容易的控制住线程。在多个线程启动的时候,一定要注意线程之间的逻辑。多个线程内部的程序的运行是否需要依赖其他线程内部的代码的功能的完成。
例如:
new Thread1(){
public void run(){
Test1();//其中创建了一个类中的一个list数据结构。
}
}.start();
new Thread2(){
public void run(){
Test2();//其中用到了Thread1中创建的list的数据结构
}
}.start();
上面的这个程序就是线程2用到了线程1中创建的一个数据结构,如果第一个线程没有完成,第二个线程启动就会报错。
3.混乱的思路造成混乱的代码,混乱的代码造成一个应用的混乱的bug。
(1)放弃很多类都使用到的函数公用化
(2)放弃主线程操作事件而采用多线程混乱执行操作。这样容易造成线程的不可控以及逻辑的不明朗。为后续整理代码的过程造成理解上的错误。
(3)做应用的逻辑思路不明朗,造成应用开发过程中的解决方案的频繁修改,从而导致名字代码很难维护
(4)产品定义的频繁改动造成开发人员没有明确的思路,在工程日前很紧的情况下造成代码逻辑错误的增加
(5)只注重功能性代码的实现而未考虑异常的捕获以及对可能出现的错误没有采取措施,这是bug出现最多的方面
(6)把写damon小实例和写工程代码分开,最好别在工程代码中测试你的damon,你的一时懒惰容易造成代码的累赘和丑陋
4.总结:
(1)明确自己要做的,有目的性的构造自己的应用逻辑。
(2)别懒惰。别为了复制而复制,如果你认为一个类中的部分代码在另一个类中需要用,别简单的复制过来,想想第一条。
(3)把能够功能化的代码函数化,把能够复用的代码公共化,形成功能化的构件化代码的思想。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wbw1985/archive/2010/04/22/5514476.aspx