91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android實現自定義Crash handler記錄崩潰信息實例代碼

發布時間:2020-09-10 05:54:14 來源:腳本之家 閱讀:180 作者:Rust Fisher 欄目:移動開發

前言

在使用自己開發的android應用時,偶爾會出現 系統已停止運行 錯誤.這時候如果能記錄錯誤日志,是非常有幫助的。

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

應用崩潰時,盡可能的收集多的數據,方便后續定位追蹤修改。

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

主要使用的方法是Thread.UncaughtExceptionHandler

方法如下

一般在application中啟動CrashHandler,個人認為應該放在調用其他模塊前盡早啟動。

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();
 }

 /**
  * 這個是最關鍵的函數,當程序中有未被捕獲的異常,系統將會自動調用uncaughtException方法
  * thread為出現未捕獲異常的線程,ex為未捕獲的異常,有了這個ex,我們就可以得到異常信息
  */
 @Override
 public void uncaughtException(Thread thread, Throwable ex) {
  try {
   //導出異常信息到SD卡中
   dumpExceptionToSDCard(ex);
   //這里可以上傳異常信息到服務器,便于開發人員分析日志從而解決bug
   uploadExceptionToServer();
  } catch (IOException e) {
   e.printStackTrace();
  }
  ex.printStackTrace();
  //如果系統提供默認的異常處理器,則交給系統去結束程序,否則就由自己結束自己
  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() {
  // 將異常信息發送到服務器
 }

 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架構
  sb.append("CPU ABI:").append("\n");
  for (String abi : Build.SUPPORTED_ABIS) {
   sb.append(abi).append("\n");
  }
  return sb.toString();
 }
}

使用方式,可在Application中調用初始化方法

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特右旗| 贵德县| 武清区| 定陶县| 福贡县| 潼南县| 长丰县| 尚义县| 长寿区| 河南省| 宣化县| 砚山县| 寿宁县| 旬邑县| 乐平市| 尼木县| 南和县| 马尔康县| 交城县| 田阳县| 南靖县| 云浮市| 天气| 永嘉县| 泉州市| 枣阳市| 新宁县| 冷水江市| 彝良县| 平乐县| 常宁市| 定南县| 望江县| 米脂县| 桐城市| 依安县| 洛隆县| 东台市| 若羌县| 旌德县| 织金县|