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

前言

創(chuàng)新互聯(lián)專注于達茂旗網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供達茂旗營銷型網(wǎng)站建設(shè),達茂旗網(wǎng)站制作、達茂旗網(wǎng)頁設(shè)計、達茂旗網(wǎng)站官網(wǎng)定制、小程序設(shè)計服務(wù),打造達茂旗網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供達茂旗網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

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

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

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

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

主要使用的方法是Thread.UncaughtExceptionHandler

方法如下

一般在application中啟動CrashHandler,個人認為應(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)提供默認的異常處理器,則交給系統(tǒng)去結(jié)束程序,否則就由自己結(jié)束自己
  if (mDefaultCrashHandler != null) {
   mDefaultCrashHandler.uncaughtException(thread, ex);
  } else {
   try {
    Thread.sleep(2000); // 延遲2秒殺進程
   } 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");
  //手機制造商
  sb.append("Vendor: ");
  sb.append(Build.MANUFACTURER).append("\n");
  //手機型號
  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)用初始化方法

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

總結(jié)

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

文章題目:Android實現(xiàn)自定義Crashhandler記錄崩潰信息實例代碼
URL標(biāo)題:http://muchs.cn/article38/gedhpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣企業(yè)建站、標(biāo)簽優(yōu)化、做網(wǎng)站、定制網(wǎng)站、網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)