語文基礎日誌

android 捕獲系統異常並上傳日誌的實例

本文已影響 2.17W人 

在做項目時,經常會把錯誤利用異常拋出去,這樣在開發時就可以通過手機拋出的異常排查錯誤。但是當程序開發完畢,版本穩定,需要上線時,爲了避免拋出異常影響用戶感受,可以用UncaughtExceptionHandler捕獲全局異常,對異常做出處理。比如我們可以獲取到拋出異常的時間、手機的硬件信息、錯誤的堆棧信息,然後將獲取到的所有的信息發送到服務器中,也可以發送到指定的`郵件中,以便及時修改bug。

android 捕獲系統異常並上傳日誌的實例

示例:

自定義異常類實現UncaughtExceptionHandler接口,當某個頁面出現異常就會調用uncaughtException這個方法,我們可以在這個方法中獲取異常信息、時間等,然後將獲取到的信息發送到我們指定的服務器

複製代碼 代碼如下:

/**

* 自定義的 異常處理類 , 實現了 UncaughtExceptionHandler接口

* @author Administrator

*

*/

public class MyCrashHandler implements UncaughtExceptionHandler {

// 需求是 整個應用程序 只有一個 MyCrash-Handler

private static MyCrashHandler myCrashHandler ;

private Context context;

private DoubanService service;

private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

//1.私有化構造方法

private MyCrashHandler(){

}

public static synchronized MyCrashHandler getInstance(){

if(myCrashHandler!=null){

return myCrashHandler;

}else {

myCrashHandler = new MyCrashHandler();

return myCrashHandler;

}

}

public void init(Context context,DoubanService service){

ext = context;

ice = service;

}

public void uncaughtException(Thread arg0, Throwable arg1) {

tln("程序掛掉了 ");

// 1.獲取當前程序的版本號. 版本的id

String versioninfo = getVersionInfo();

// 2.獲取手機的硬件信息.

String mobileInfo = getMobileInfo();

// 3.把錯誤的堆棧信息 獲取出來

String errorinfo = getErrorInfo(arg1);

// 4.把所有的信息 還有信息對應的時間 提交到服務器

try {

teNote(new PlainTextConstruct(at(new Date())),

new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");

} catch (Exception e) {

tStackTrace();

}

//幹掉當前的程序

Process(d());

}

/**

* 獲取錯誤的信息

* @param arg1

* @return

*/

private String getErrorInfo(Throwable arg1) {

Writer writer = new StringWriter();

PrintWriter pw = new PrintWriter(writer);

tStackTrace(pw);

e();

String error= ring();

return error;

}

/**

* 獲取手機的硬件信息

* @return

*/

private String getMobileInfo() {

StringBuffer sb = new StringBuffer();

//通過反射獲取系統的硬件信息

try {

Field[] fields = eclaredFields();

for(Field field: fields){

//暴力反射 ,獲取私有的信息

ccessible(true);

String name = ame();

String value = (null)ring();

nd(name+"="+value);

nd("n");

}

} catch (Exception e) {

tStackTrace();

}

return ring();

}

/**

* 獲取手機的版本信息

* @return

*/

private String getVersionInfo(){

try {

PackageManager pm = ackageManager();

PackageInfo info =ackageInfo(ackageName(), 0);

return ionName;

} catch (Exception e) {

tStackTrace();

return "版本號未知";

}

}

}

創建一個Application實例將MyCrashHandler註冊到整個應用程序上,創建出服務並進行傳遞:

複製代碼 代碼如下:

/**

* 整個(app)程序初始化之前被調用

* @author Administrator

*

*/

public class DoubanApplication extends Application {

public NoteEntry entry;

@Override

public void onCreate() {

eate();

String apiKey = "0fab7f9aa21f39cd2f027ecfe65dad67";

String secret = "87fc1c5e99bfa5b3";

// 獲取到service

DoubanService myService = new DoubanService("我的小豆豆", apiKey,

secret);

ccessToken("1fa4e5be0f808a0b5eeeb13a2e819e21", "56a622c1138dbfce");

MyCrashHandler handler = nstance();

(getApplicationContext(),myService);

efaultUncaughtExceptionHandler(handler);

}

}

猜你喜歡

熱點閱讀

最新文章

推薦閱讀