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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章