在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);
}
}