欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

前言

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

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

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

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

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

主要使用的方法是Thread.UncaughtExceptionHandler

方法如下

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

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;
 // 自定義存儲(chǔ)的目錄
 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();
 }

 /**
  * 這個(gè)是最關(guān)鍵的函數(shù),當(dāng)程序中有未被捕獲的異常,系統(tǒng)將會(huì)自動(dòng)調(diào)用uncaughtException方法
  * thread為出現(xiàn)未捕獲異常的線程,ex為未捕獲的異常,有了這個(gè)ex,我們就可以得到異常信息
  */
 @Override
 public void uncaughtException(Thread thread, Throwable ex) {
  try {
   //導(dǎo)出異常信息到SD卡中
   dumpExceptionToSDCard(ex);
   //這里可以上傳異常信息到服務(wù)器,便于開(kāi)發(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卡不存在或無(wú)法使用,則無(wú)法把異常信息寫(xiě)入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版本號(hào)
  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ī)型號(hào)
  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é)

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

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

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

廣告

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

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