基于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)受住了測(cè)試部門魔鬼般的考驗(yàn),但是當(dāng)你的應(yīng)用發(fā)布到市場(chǎng),面對(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)場(chǎng)。
}
}
在主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)場(chǎng)繼續(xù)運(yùn)行的意義不大。Crash以后,程序的運(yùn)行情況已經(jīng)是不可預(yù)知的了,用一個(gè)錯(cuò)誤,去彌補(bǔ)另外一個(gè)錯(cuò)誤,本身就會(huì)導(dǎo)致更多的錯(cuò)誤。建議還是盡量避免Crash的發(fā)生更合理。
相關(guān)文章
ListView的Adapter使用 之 初學(xué)ArrayAdapter String
ListView是Android中經(jīng)常會(huì)使用的東西,綁定數(shù)據(jù)對(duì)于初學(xué)者來說,尤其是剛接觸編程的人來說,往往會(huì)覺得很難理解,我上大二的時(shí)候?qū)W的java,但是基本上相當(dāng)于沒有學(xué),什么都沒寫過,真正接觸編程就是開始上手學(xué)android,把這些記錄下來,自己可以回頭看下,也可以讓新手更好的理解2013-06-06
新版Flutter集成到已有Android項(xiàng)目的實(shí)現(xiàn)
這篇文章主要介紹了新版Flutter集成到已有Android項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Android中g(shù)oogle Zxing實(shí)現(xiàn)二維碼與條形碼掃描
這篇文章主要介紹了Android中g(shù)oogle Zxing實(shí)現(xiàn)二維碼與條形碼掃描的相關(guān)資料,需要的朋友可以參考下2017-05-05
第1個(gè)Android應(yīng)用程序 Android制作簡單單頁導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了第1個(gè)Android應(yīng)用程序PhonewordApp:Android制作簡單單頁導(dǎo)航,感興趣的小伙伴們可以參考一下2016-06-06
MPAndroidChart繪制自定義運(yùn)動(dòng)數(shù)據(jù)圖表示例詳解
這篇文章主要為大家介紹了MPAndroidChart繪制自定義運(yùn)動(dòng)數(shù)據(jù)圖表示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Android Http實(shí)現(xiàn)文件的上傳和下載
這篇文章主要為大家詳細(xì)介紹了Android Http實(shí)現(xiàn)文件的上傳和下載,感興趣的小伙伴們可以參考一下2016-08-08

