Android使用UncaughtExceptionHandler捕获全局异常

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值