基于Android應(yīng)用中如何反饋Crash報(bào)告的詳解
為什么需要反饋Crash報(bào)告?
做Android應(yīng)用程序,要盡量避免程序Crash的發(fā)生。雖然說零Crash是程序員追逐的最終目標(biāo),但是現(xiàn)實(shí)的情況是,程序員只能盡量的減少Crash的發(fā)生,而幾乎不可能完全杜絕Crash。也許,你認(rèn)為你的應(yīng)用的健壯性已經(jīng)近乎完美,輕松的經(jīng)受住了測試部門魔鬼般的考驗(yàn),但是當(dāng)你的應(yīng)用發(fā)布到市場,面對(duì)百萬甚至千萬級(jí)別的用戶的時(shí)候,可能就沒有那么幸運(yùn)了。
基于以上原因,一般的應(yīng)用程序,都要有一個(gè)Crash反饋的機(jī)制。程序員可以根據(jù)反饋的結(jié)果,對(duì)當(dāng)前的版本的代碼進(jìn)行改進(jìn),使發(fā)布的下一個(gè)版本更加穩(wěn)定。
如何反饋?
先來看如何捕獲Crash的發(fā)生。
Java中有一個(gè)接口,UncaughtExceptionHandler,先看描述。
|
Thread.UncaughtExceptionHandler |
再來看Thread類中的一個(gè)方法。
|
setDefaultUncaughtExceptionHandler |
看了這些API,就知道我們需要實(shí)現(xiàn)這樣一個(gè)接口,然后在程序的主線程中設(shè)置處理程序。
看下面的接口實(shí)現(xiàn)。
package com.arui.framework.android.exception;
import java.lang.Thread.UncaughtExceptionHandler;
import android.content.Context;
/**
* Default exception handler for all activities.
*
* @author http://blog.csdn.net/arui319
* @version 2011/12/01
*
*/
public class DefaultExceptionHandler implements UncaughtExceptionHandler {
private Context act = null;
public DefaultExceptionHandler(Context act) {
this.act = act;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// 收集異常信息 并且發(fā)送到服務(wù)器
sendCrashReport(ex);
// 等待半秒
try {
Thread.sleep(500);
} catch (InterruptedException e) {
//
}
// 處理異常
handleException();
}
private void sendCrashReport(Throwable ex) {
StringBuffer exceptionStr = new StringBuffer();
exceptionStr.append(ex.getMessage());
StackTraceElement[] elements = ex.getStackTrace();
for (int i = 0; i < elements.length; i++) {
exceptionStr.append(elements[i].toString());
}
//TODO
//發(fā)送收集到的Crash信息到服務(wù)器
}
private void handleException() {
//TODO
//這里可以對(duì)異常進(jìn)行處理。
//比如提示用戶程序崩潰了。
//比如記錄重要的信息,嘗試恢復(fù)現(xiàn)場。
//或者干脆記錄重要的信息后,直接殺死程序。
}
}
在主Activity的onCreate(Bundle savedInstanceState)方法中增加如下代碼。
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler(
this.getApplicationContext()));
如何發(fā)送到服務(wù)器?
這個(gè)不同的項(xiàng)目組會(huì)有不同的方式,具體不在這里討論了。需要提醒的是,除了把異常的具體信息發(fā)送給服務(wù)器外,至少還需要發(fā)送版本信息,這樣程序員才可以判斷服務(wù)器上的異常信息是哪個(gè)版本出現(xiàn)的。除了版本信息,可能還需要手機(jī)的SDK版本,屏幕分辨率,手機(jī)型號(hào)等等信息,有了這些信息,可以更全面的了解異常信息。
更多說明。
只需要在主Activity中設(shè)置一次異常處理類即可,不需要在所有的Acitivity都進(jìn)行設(shè)置。
個(gè)人感覺Crash發(fā)生后,恢復(fù)現(xiàn)場繼續(xù)運(yùn)行的意義不大。Crash以后,程序的運(yùn)行情況已經(jīng)是不可預(yù)知的了,用一個(gè)錯(cuò)誤,去彌補(bǔ)另外一個(gè)錯(cuò)誤,本身就會(huì)導(dǎo)致更多的錯(cuò)誤。建議還是盡量避免Crash的發(fā)生更合理。
- Android 應(yīng)用Crash 后自動(dòng)重啟的方法小結(jié)
- Android實(shí)現(xiàn)自定義Crash handler記錄崩潰信息實(shí)例代碼
- Android CrashHandler編寫自己的異常捕獲的方法
- Android使用CrashHandler來獲取應(yīng)用的crash信息的方法
- 完美解決Android Studio集成crashlytics后無法編譯的問題
- Crashlytics Android 異常報(bào)告統(tǒng)計(jì)管理(詳解)
- Android 中Crash時(shí)如何獲取異常信息詳解及實(shí)例
- Android app會(huì)crash的原因及解決方法
相關(guān)文章
Android中TextView顯示插入的圖片實(shí)現(xiàn)方法
這篇文章主要介紹了Android中TextView顯示插入的圖片實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了TextView三種顯示插入圖片的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08android上一個(gè)可追蹤代碼具體到函數(shù)某行的日志類
追蹤代碼到函數(shù)具體某行,這樣的功能,是每一個(gè)程序員都希望會(huì)有的,因?yàn)樗梢詭椭覀冏粉櫟侥承写a的錯(cuò)誤,接下來介紹下android上一個(gè)可追蹤代碼到函數(shù)具體某行的日志類,希望對(duì)開發(fā)者有所幫助2012-12-12Android中ListView Item布局優(yōu)化技巧
這篇文章主要介紹了Android中ListView Item布局優(yōu)化技巧,以實(shí)例形式分析了ListView Item布局的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10android圖像繪制(七)ClipRect局部繪圖/切割原圖繪制總結(jié)
這幾天開始學(xué)游戲地圖制作,今天小小的總結(jié)一下Canvas的clipRect()接口的使用,接下來介紹ClipRect局部繪圖/切割原圖繪制感興趣的朋友可以了解下2013-01-01Android編程實(shí)現(xiàn)變化的雙重選擇框功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)變化的雙重選擇框功能,結(jié)合實(shí)例形式分析了Android雙重選擇框功能的樣式布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10appium運(yùn)行各種坑爹報(bào)錯(cuò)問題及解決方法【推薦】
這篇文章主要介紹了 appium運(yùn)行各種坑爹報(bào)錯(cuò)問題及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06