1. 程式人生 > >Android異常處理——UncaughtExceptionHandler捕獲全域性異常

Android異常處理——UncaughtExceptionHandler捕獲全域性異常

  Android系統的“程式異常退出”,給應用的使用者體驗造成不良影響。為了捕獲應用執行時異常並給出友好提示,便可繼承UncaughtExceptionHandler類來處理。通過Thread.setDefaultUncaughtExceptionHandler()方法將異常處理類設定到執行緒上即可。

1、異常處理類,程式碼如下:

public class CrashHandler implements UncaughtExceptionHandler {
     public static final String TAG = "CrashHandler";
     private static CrashHandler INSTANCE = new CrashHandler();
     private Context mContext;
     private Thread.UncaughtExceptionHandler mDefaultHandler;

     private CrashHandler() {
     }

     public static CrashHandler getInstance() {
         return INSTANCE;
     }

     public void init(Context ctx) {
         mContext = ctx;
         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
         Thread.setDefaultUncaughtExceptionHandler(this);
     }

     @Override
     public void uncaughtException(Thread thread, Throwable ex) {
         // if (!handleException(ex) && mDefaultHandler != null) {
         // mDefaultHandler.uncaughtException(thread, ex);
         // } else {
         // android.os.Process.killProcess(android.os.Process.myPid());
         // System.exit(10);
         // }
         System.out.println("uncaughtException");

         new Thread() {
             @Override
             public void run() {
                 Looper.prepare();
                 new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)
                         .setMessage("程式崩潰了...").setNeutralButton("我知道了", new OnClickListener() {
                             @Override
                             public void onClick(DialogInterface dialog, int which) {
                                 System.exit(0);
                             }
                         })
                         .create().show();
                 Looper.loop();
             }
         }.start();
     }

     /**
      * 自定義錯誤處理,收集錯誤資訊 傳送錯誤報告等操作均在此完成. 開發者可以根據自己的情況來自定義異常處理邏輯
     * 
      * @param ex
      * @return true:如果處理了該異常資訊;否則返回false
      */
     private boolean handleException(Throwable ex) {
         if (ex == null) {
             return true;
         }
         // new Handler(Looper.getMainLooper()).post(new Runnable() {
         // @Override
         // public void run() {
         // new AlertDialog.Builder(mContext).setTitle("提示")
         // .setMessage("程式崩潰了...").setNeutralButton("我知道了", null)
         // .create().show();
         // }
         // });

         return true;
     }
}

2、執行緒繫結異常處理類

public class CrashHandlerActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        CrashHandler crashHandler = CrashHandler.getInstance();  
        crashHandler.init(this);  //傳入引數必須為Activity,否則AlertDialog將不顯示。
        // 建立錯誤
        throw new NullPointerException();
    }
}