Android系統的“程序異常退出”,給應用的用戶體驗造成不良影響。爲了捕獲應用運行時異常並給出友好提示,便可繼承UncaughtExceptionHandler類來處理。通過Thread.setDefaultUncaughtExceptionHandler()方法將異常處理類設置到線程上即可。
1、自定義的實現UncaughtExceptionHandler方法的類。
<pre name="code" class="java">package com.example.unkownexception;
import java.lang.Thread.UncaughtExceptionHandler;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Looper;
public class MyUnKownException implements UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler mDefaultHandle;
private Context mContext;
private static MyUnKownException mMyUnKownException;
public static MyUnKownException getMyUnKownException(Context context) {
if (mMyUnKownException == null) {
mMyUnKownException = new MyUnKownException(context);
}
return mMyUnKownException;
}
private MyUnKownException(Context context) {
this.mContext = context;
mDefaultHandle = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandle != null) {
mDefaultHandle.uncaughtException(thread, ex);
}
}
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
new Thread(new Runnable() {
@Override
public void run() {
//這裏必須寫在線程中,寫在外面對話框不顯示,自己可以試試
Looper.prepare();
final AlertDialog ad = new AlertDialog.Builder(mContext)
.setTitle("溫馨提示").setMessage("發生了異常錯誤").setCancelable(false)
.setNeutralButton("我知道了", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
android.os.Process
.killProcess(android.os.Process.myPid());
System.exit(1);
}
}).create();
ad.show();
Looper.loop();
}
}).start();
// 這裏可以寫一些打印log的方法
//或者發送錯誤到服務器端,給開發人員進行分析
return true;
}
}
2、測試Acticity類
package com.example.unkownexception;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyUnKownException munk = MyUnKownException.getMyUnKownException(this);
throw new NullPointerException();
}
}