国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android實現(xiàn)自定義Crash handler記錄崩潰信息實例代碼

2019-10-22 18:14:38
字體:
供稿:網(wǎng)友

前言

在使用自己開發(fā)的android/57742.html">android/280481.html">android應(yīng)用時,偶爾會出現(xiàn) 系統(tǒng)已停止運(yùn)行 錯誤.這時候如果能記錄錯誤日志,是非常有幫助的。

App異常崩潰信息存入文件中。

應(yīng)用崩潰時,盡可能的收集多的數(shù)據(jù),方便后續(xù)定位追蹤修改。

如果可以,盡量將崩潰日志上傳到服務(wù)器。一些集成服務(wù)已經(jīng)提供了相應(yīng)的功能。

主要使用的方法是Thread.UncaughtExceptionHandler

方法如下

一般在application中啟動CrashHandler,個人認(rèn)為應(yīng)該放在調(diào)用其他模塊前盡早啟動。

CrashHandler.java

import android.os.Build;import android.os.Environment;import android.os.Process;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;public class CrashHandler implements Thread.UncaughtExceptionHandler { private static final String TAG = "CrashHandler"; private static final boolean DEBUG = true; // 自定義存儲的目錄 private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/myApp/log/"; private static final String FILE_NAME = "crash"; private static final String FILE_NAME_SUFFIX = ".txt"; private String phoneInfo; private static CrashHandler instance = new CrashHandler(); private Thread.UncaughtExceptionHandler mDefaultCrashHandler; private CrashHandler() { } public static CrashHandler getInstance() {  return instance; } public void init() {  mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();  Thread.setDefaultUncaughtExceptionHandler(this);  phoneInfo = getPhoneInformation(); } /**  * 這個是最關(guān)鍵的函數(shù),當(dāng)程序中有未被捕獲的異常,系統(tǒng)將會自動調(diào)用uncaughtException方法  * thread為出現(xiàn)未捕獲異常的線程,ex為未捕獲的異常,有了這個ex,我們就可以得到異常信息  */ @Override public void uncaughtException(Thread thread, Throwable ex) {  try {   //導(dǎo)出異常信息到SD卡中   dumpExceptionToSDCard(ex);   //這里可以上傳異常信息到服務(wù)器,便于開發(fā)人員分析日志從而解決bug   uploadExceptionToServer();  } catch (IOException e) {   e.printStackTrace();  }  ex.printStackTrace();  //如果系統(tǒng)提供默認(rèn)的異常處理器,則交給系統(tǒng)去結(jié)束程序,否則就由自己結(jié)束自己  if (mDefaultCrashHandler != null) {   mDefaultCrashHandler.uncaughtException(thread, ex);  } else {   try {    Thread.sleep(2000); // 延遲2秒殺進(jìn)程   } catch (InterruptedException e) {    e.printStackTrace();   }   android.os.Process.killProcess(Process.myPid());  } } private void dumpExceptionToSDCard(Throwable ex) throws IOException {  //如果SD卡不存在或無法使用,則無法把異常信息寫入SD卡  if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {   if (DEBUG) {    Log.e(TAG, "sdcard unmounted,skip dump exception");    return;   }  }  File dir = new File(PATH);  if (!dir.exists()) {   dir.mkdirs();  }  long current = System.currentTimeMillis();  String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date(current));  File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);  try {   PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));   pw.println(time);   pw.println(phoneInfo);   pw.println();   ex.printStackTrace(pw);   pw.close();   Log.e(TAG, "dump crash info seccess");  } catch (Exception e) {   Log.e(TAG, e.getMessage());   Log.e(TAG, "dump crash info failed");  } } private void uploadExceptionToServer() {  // 將異常信息發(fā)送到服務(wù)器 } private String getPhoneInformation() {  StringBuilder sb = new StringBuilder();  sb.append("App version name:")    .append(BuildConfig.VERSION_NAME)    .append(", version code:")    .append(BuildConfig.VERSION_CODE).append("/n");  //Android版本號  sb.append("OS Version: ");  sb.append(Build.VERSION.RELEASE);  sb.append("_");  sb.append(Build.VERSION.SDK_INT).append("/n");  //手機(jī)制造商  sb.append("Vendor: ");  sb.append(Build.MANUFACTURER).append("/n");  //手機(jī)型號  sb.append("Model: ");  sb.append(Build.MODEL).append("/n");  //CPU架構(gòu)  sb.append("CPU ABI:").append("/n");  for (String abi : Build.SUPPORTED_ABIS) {   sb.append(abi).append("/n");  }  return sb.toString(); }}

使用方式,可在Application中調(diào)用初始化方法

@Overridepublic void onCreate() { super.onCreate(); // init application... CrashHandler.getInstance().init();}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 无极县| 道孚县| 甘谷县| 乃东县| 东阿县| 广东省| 鄂尔多斯市| 怀化市| 台东县| 三原县| 抚松县| 咸丰县| 嘉义市| 岫岩| 甘肃省| 盐亭县| 鄢陵县| 桃江县| 牙克石市| 南平市| 敖汉旗| 辽阳市| 阳春市| 甘洛县| 逊克县| 昌宁县| 台中县| 克东县| 安溪县| 固镇县| 长海县| 清涧县| 息烽县| 延吉市| 陈巴尔虎旗| 冀州市| 天等县| 彭阳县| 正镶白旗| 东源县| 阿拉善盟|