Thread.UncaughtExceptionHandler捕獲未知異常

在Android開發中,常常會出現uncheched Exception 導致程序的crash,爲了提供良好的用戶體驗,並對出錯的信息進行收集,以便對程序進行改進,提高程序的健壯性。因此,常使用Thread.UncaughtExceptionHandler來進行處理。

首先需要繼承Thread.UncaughtExceptionHandler類

public class CrashHandler implements Thread.UncaughtExceptionHandler {  
    public static final String TAG = CrashHandler.class.getSimpleName();  
    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;  
    }  
}  
然後在Application類中進行註冊
public class MyApplication extends Application{  
  
  
    @Override  
    public void onCreate(){  
    super.onCreate();  
        initErrorHandler();  
    }  
  
  
   private void initErrorHandler(){  
    CrashHandler handler = CrashHandler.getInstance();  
    handler.init(this);  
   }  
} 


發佈了26 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章