关于Android Force Close 出现的原因 以及解决方法

来源:互联网 发布:数据库基础与实践技术 编辑:程序博客网 时间:2024/05/16 19:21

1,forceclose出现原因

forceclose,意为强行关闭,当前应用程序发生了冲突

NullPointExection(空指针),IndexOutOfBoundsException(角标越界)等等一系列未捕获异常

2,避免forceclose方案

首先是尽可能的保证程序不出这些异常,如果有些异常实在不可避免而又不想让程序弹出forceclose弹窗,可以使用UncaughtExceptionHandler。。当程序出现未捕获异常时会去调用UncaughtExctionHandler中的uncaughtException方法,我们要做的就是实现UncaughtExceptionHandler类,自行处理未捕获异常,代码如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.lang.Thread.UncaughtExceptionHandler;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.os.Process;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.TextView;  
  12.   
  13.   
  14. public class MainActivity extends Activity implements UncaughtExceptionHandler,  
  15.         OnClickListener{  
  16.       
  17.       
  18.     private List<String> mList = new ArrayList<String>();  
  19.     private TextView mTv;  
  20.       
  21.     private int pid;  
  22.       
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         // TODO Auto-generated method stub  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.           
  29.         Log.i("tag""--->>onCreate");  
  30.           
  31.         initView();  
  32.         Thread.setDefaultUncaughtExceptionHandler(this);  
  33.           
  34.     }  
  35.       
  36.     @Override  
  37.     protected void onStart() {  
  38.         // TODO Auto-generated method stub  
  39.         super.onStart();  
  40.         Log.i("tag""--->>onstart");  
  41.     }  
  42.       
  43.          @Override  
  44.     protected void onRestart() {  
  45.         // TODO Auto-generated method stub  
  46.         super.onRestart();  
  47.         Log.i("tag""--->>onRestart");  
  48.     }  
  49.       
  50.     @Override  
  51.     protected void onResume() {  
  52.         // TODO Auto-generated method stub  
  53.         super.onResume();  
  54.         Log.i("tag""--->>onresume");  
  55.     }  
  56.       
  57.     /** 
  58.      * 初始化控件 
  59.      */  
  60.     private void initView() {  
  61.         mTv = (TextView) findViewById(R.id.tv);  
  62.         mTv.setOnClickListener(this);  
  63.           
  64.     }  
  65.   
  66.     @Override  
  67.     public void uncaughtException(Thread arg0, Throwable arg1) {  
  68.         // TODO Auto-generated method stub  
  69.         Log.i("tag",  "截获到forceclose,异常原因为:" + "\n" +  
  70.                    arg1.toString());  
  71.             finish();//结束当前activity  
  72.     }  
  73.   
  74.     @Override  
  75.     public void onClick(View arg0) {  
  76.         // TODO Auto-generated method stub  
  77.         switch (arg0.getId()) {  
  78.         case R.id.tv:   
  79.                         mList.get(1) ;//产生异常  
  80.             break;  
  81.   
  82.         default:  
  83.             break;  
  84.         }  
  85.     }  
  86.       
  87.     @Override  
  88.     protected void onPause() {  
  89.         super.onPause();  
  90.         Log.i("tag""--》onpause");  
  91.     }  
  92.       
  93.     @Override  
  94.     protected void onStop() {  
  95.         // TODO Auto-generated method stub  
  96.         super.onStop();  
  97.         Log.i("tag""--->onstop");  
  98.     }  
  99.       
  100.     @Override  
  101.     protected void onDestroy() {  
  102.         // TODO Auto-generated method stub  
  103.         super.onDestroy();  
  104.         Log.i("tag""-->ondestroy");  
  105.     }  
  106. }  

接下来,看log日志的结果:

成功捕获到了异常,而且activity也退出了,可是并不是安全退出,因为当你再次点击打开apk时,发现程序无响应,出现的错误log如下:

程序加载activity超时,这涉及到activity的启动过程,大家可以参考老罗的博客,里边儿介绍的很详细


为了解决上述问题,我在uncaughtException方法里将进程杀死,杀死进程有好多中方法,在此列举一个自杀式方法

修改如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. protected void onStart() {  
  3.     // TODO Auto-generated method stub  
  4.     super.onStart();  
  5.     pid = android.os.Process.myPid();//获取到本应用程序的pid  
  6.     Log.i("tag""--->>onstart");  
  7. }  

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Override  
  2.     public void uncaughtException(Thread arg0, Throwable arg1) {  
  3.         // TODO Auto-generated method stub  
  4.         Log.i("tag",  "截获到forceclose,异常原因为:" + "\n" +  
  5.                    arg1.toString());  
  6.         Process.killProcess(pid);//杀死进程  
  7.           
  8.       
  9.     }  

其他程序未变。。

3,我们不仅可以在主线程中这么做,还可以在子线程中进行:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private class ChildThread implements Runnable, UncaughtExceptionHandler{  
  2.   
  3.         @Override  
  4.         public void run() {  
  5.             // TODO Auto-generated method stub  
  6.             Thread.setDefaultUncaughtExceptionHandler(this);  
  7.         }  
  8.   
  9.         @Override  
  10.         public void uncaughtException(Thread arg0, Throwable arg1) {  
  11.             // TODO Auto-generated method stub  
  12.             Log.i("tag""childThread");  
  13.         }  
  14.           
  15.     }  
然后在activity的生命周期中开启子线程,监听未捕获异常的发生


0 0
原创粉丝点击