Android使用UncaughtExceptionHandler捕获全局异常

Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。

import java.lang.Thread.UncaughtExceptionHandler;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import com.chinapnr.android.pf.common.util.Logger;

import android.content.Context;

public class CrashHandler implements UncaughtExceptionHandler {

	private Thread.UncaughtExceptionHandler mDefaultHandler;
	private static CrashHandler sInstance = new CrashHandler();
	private Map<String, String> infos = new HashMap<String, String>();
	private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
	private Context mContext;
	private IRestartCallback mRestartor = null;

	public static CrashHandler getInstance() {
		return sInstance;
	}

	public interface IRestartCallback {
		public void restart();
	}

	public void init(Context context, IRestartCallback restartor) {
		mContext = context;
		mRestartor = restartor;
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		if (!handleException(thread, ex) && mDefaultHandler != null) {
			mDefaultHandler.uncaughtException(thread, ex);
		}

		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			Logger.e(CrashHandler.class, "error : ");
		}
		android.os.Process.killProcess(android.os.Process.myPid());
		System.exit(1);

	}

	private boolean handleException(Thread thread, Throwable ex) {
		if (ex == null) {
			return false;
		}
		Logger.e(CrashHandler.class,
				new StringBuffer("UncaughtException in proc[").append(ChinapnrApplication.procName).append("],thread[")
						.append(thread.getName()).append(",").append(thread.getId()).append("]").toString()
				+ android.util.Log.getStackTraceString(ex));
		if (mRestartor != null) {
			mRestartor.restart();
		}
		return true;
	}
}


Application中使用方式:
public class TestApplication extends Application {

	public static int pid = 0;
	public static String procName = null;

	@Override
	public void onCreate() {
		super.onCreate();
		init();
		CrashHandler.getInstance().init(this, mRestartor);
	}

	private void init() {
		pid = android.os.Process.myPid();
		ActivityManager mActivityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
		if (mActivityManager.getRunningAppProcesses() == null) {
			Logger.e(ChinapnrApplication.class, "RuntimeEnv init exception, there is no running process.");
			return;
		}
		for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses()) {
			if (appProcess != null) {
				if (appProcess.pid == pid) {
					procName = appProcess.processName;
				}
			}

		}
	}

	private CrashHandler.IRestartCallback mRestartor = new IRestartCallback() {
		@Override
		public void restart() {
			// 处理异常退出的流程

		}
	};
}
代码下载地址: 点击打开下载页面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值