Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android崩潰捕獲

Android崩潰捕獲

編輯:關於Android編程

 

public class ErrorReport implements Thread.UncaughtExceptionHandler{
	public static final String TAG = GouMinErrorReport;

	private Context mContext;
	// 系統默認的 UncaughtException 處理類
	private Thread.UncaughtExceptionHandler mDefaultHandler;

	private String logStr;

	public ErrorReport(Context context) {

		mContext = context;
		// 獲取系統默認的 UncaughtException 處理器
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		GMLog.i(TAG, uncaughtException);
		GMLog.i(TAG, ex.getLocalizedMessage());
		ex.printStackTrace();

		logStr = getStackTrace(ex);

		// 使用 Toast 來顯示異常信息
		new Thread() {
			@Override
			public void run() {
				Looper.prepare();
				Toast.makeText(mContext, 很抱歉,程序出現異常,即將退出。, Toast.LENGTH_SHORT)
						.show();
				sendReport(logStr);
				Looper.loop();
			}
		}.start();

		// 如果用戶沒有處理則讓系統默認的異常處理器來處理
		if (mDefaultHandler != null) {
			mDefaultHandler.uncaughtException(thread, ex);
		}

	}

	private void sendReport(String stackTrace) {

		GMLog.i(TAG, sendReport);

		

		HttpClient httpclient = new DefaultHttpClient();

		final HttpPost httppost = new HttpPost(mErrorReportReq.getUrl());

		try {
			httppost.setEntity(new StringEntity(stackTrace) ));
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		HttpResponse httpResponse;
		try {
			httpResponse = httpclient.execute(httppost);

			final int statusCode = httpResponse.getStatusLine().getStatusCode();
			GMLog.i(TAG, sendReport response statusCode is: + statusCode);
			if (statusCode == HttpStatus.SC_OK) {
				String response = EntityUtils.toString(
						httpResponse.getEntity(), HTTP.UTF_8);
				GMLog.i(TAG, sendReport response: + response);
			}

		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			GMLog.i(TAG, sendReport finally);
			if (httpclient != null) {
				httpclient.getConnectionManager().shutdown();
				httpclient = null;
			}
		}
	}

	private String getStackTrace(Throwable th) {

		final Writer result = new StringWriter();
		final PrintWriter printWriter = new PrintWriter(result);

		// If the exception was thrown in a background thread inside
		// AsyncTask, then the actual exception can be found with getCause
		Throwable cause = th;
		while (cause != null) {
			cause.printStackTrace(printWriter);
			cause = cause.getCause();
		}
		final String stacktraceAsString = result.toString();
		printWriter.close();

		return stacktraceAsString;
	}

}

對於Android 異常退出,主要是用到了 接口Thread.UncaughtExceptionHandler

 

 

 

public class MyApplication extends Application {

	ErrorReport errorReport;
	@Override
	public void onCreate() {
		super.onCreate();
		errorReport = new ErrorReport(this);
	}
}


 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved