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