Android系统的“程序异常退出”[转]

时间:2022-09-17 20:02:54

 

在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场。

 

如何处理未捕获的异常呢?

 

首先我们要实现一个接口  java.lang.Thread.UncaughtExceptionHandler    ,要实现该接口里面的  uncaughtException(Thread t, Throwable e) ,在这个函数里面,我们可以做一些处理。例如将异常信息保存到sdcard上的某个位置,或者提示用户异常出现等等一些操作。

 

我们在进入Activity的onCreate函数的时候,设置一下处理未捕获异常 

 

 

 

[java]   view plain copy
  1. Thread.setDefaultUncaughtExceptionHandler(  
  2.             new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this)  
  3.         );  



 

 

发生异常时,做的处理。

 

 

 

[java]   view plain copy
  1. public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {  
  2.     private final Context myContext;  
  3.   
  4.     public UncaughtExceptionHandler(Context context) {  
  5.         myContext = context;  
  6.     }  
  7.   
  8.     public void uncaughtException(Thread thread, Throwable exception) {  
  9.         StringWriter stackTrace = new StringWriter();  
  10.         exception.printStackTrace(new PrintWriter(stackTrace));  
  11.         System.err.println(stackTrace);  
  12.   
  13.         Intent intent = new Intent(  
  14.             "android.fbreader.action.CRASH",  
  15.             new Uri.Builder().scheme(exception.getClass().getSimpleName()).build()  
  16.         );  
  17.         try {  
  18.             myContext.startActivity(intent);  
  19.         } catch (ActivityNotFoundException e) {  
  20.             intent = new Intent(myContext, BugReportActivity.class);  
  21.             intent.putExtra(BugReportActivity.STACKTRACE, stackTrace.toString());  
  22.             myContext.startActivity(intent);  
  23.         }  
  24.   
  25.         if (myContext instanceof Activity) {  
  26.             ((Activity)myContext).finish();  
  27.         }  
  28.   
  29.         Process.killProcess(Process.myPid());  
  30.         System.exit(10);  
  31.     }  
  32. }  



 

 

通过这样的方式,首先能够提高用户体验,避免了强制关闭的问题的发生。更有效的收集异常信息。

 

 

 

 

//-------------------------------------------------------------------------------

 

 

继承接口UncaughtExceptionHandler,并重写里面的uncaughtException(Thread thread, Throwable ex)方法,这样就可以监测应用程序的异常情况,做相应的处理: 
public class myCustomExceptionHandler implements UncaughtExceptionHandler { 

    private UncaughtExceptionHandler defaultUEH; 

    public myCustomExceptionHandler() { 

        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
    } 

    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
        // TODO Auto-generated method stub 
        System.out.println("应用程序异常"); 
        /** 
         * 处理异常,保存异常log或向服务器发送异常报告 
         */ 
        defaultUEH.uncaughtException(thread, ex);; 
    } 
     
} 
然后在Activity中加入 Thread.setDefaultUncaughtExceptionHandler(new myCustomExceptionHandler());即可。

//--------------------------------------------------------------------------------------------------------------

Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。

1、异常处理类,代码如下:

Java代码     Android系统的“程序异常退出”[转]
  1. public class CrashHandler implements UncaughtExceptionHandler {  
  2.     public static final String TAG = "CrashHandler";  
  3.     private static CrashHandler INSTANCE = new CrashHandler();  
  4.     private Context mContext;  
  5.     private Thread.UncaughtExceptionHandler mDefaultHandler;  
  6.   
  7.     private CrashHandler() {  
  8.     }  
  9.   
  10.     public static CrashHandler getInstance() {  
  11.         return INSTANCE;  
  12.     }  
  13.   
  14.     public void init(Context ctx) {  
  15.         mContext = ctx;  
  16.         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  
  17.         Thread.setDefaultUncaughtExceptionHandler(this);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void uncaughtException(Thread thread, Throwable ex) {  
  22.         // if (!handleException(ex) && mDefaultHandler != null) {  
  23.         // mDefaultHandler.uncaughtException(thread, ex);  
  24.         // } else {  
  25.         // android.os.Process.killProcess(android.os.Process.myPid());  
  26.         // System.exit(10);  
  27.         // }  
  28.         System.out.println("uncaughtException");  
  29.   
  30.         new Thread() {  
  31.             @Override  
  32.             public void run() {  
  33.                 Looper.prepare();  
  34.                 new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)  
  35.                         .setMessage("程序崩溃了...").setNeutralButton("我知道了"new OnClickListener() {  
  36.                             @Override  
  37.                             public void onClick(DialogInterface dialog, int which) {  
  38.                                 System.exit(0);  
  39.                             }  
  40.                         })  
  41.                         .create().show();  
  42.                 Looper.loop();  
  43.             }  
  44.         }.start();  
  45.     }  
  46.   
  47.     /** 
  48.      * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑 
  49.      *  
  50.      * @param ex 
  51.      * @return true:如果处理了该异常信息;否则返回false 
  52.      */  
  53.     private boolean handleException(Throwable ex) {  
  54.         if (ex == null) {  
  55.             return true;  
  56.         }  
  57.         // new Handler(Looper.getMainLooper()).post(new Runnable() {  
  58.         // @Override  
  59.         // public void run() {  
  60.         // new AlertDialog.Builder(mContext).setTitle("提示")  
  61.         // .setMessage("程序崩溃了...").setNeutralButton("我知道了", null)  
  62.         // .create().show();  
  63.         // }  
  64.         // });  
  65.   
  66.         return true;  
  67.     }  
  68. }   

 

2、线程绑定异常处理类

Java代码     Android系统的“程序异常退出”[转]
  1. public class CrashHandlerActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         CrashHandler crashHandler = CrashHandler.getInstance();    
  8.         crashHandler.init(this);  //传入参数必须为Activity,否则AlertDialog将不显示。  
  9.         // 创建错误  
  10.         throw new NullPointerException();  
  11.     }  
  12. }