欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年02月25日 11:42:21   作者:Rust Fisher  
這篇文章主要給大家介紹了Android實現(xiàn)自定義Crash handler記錄崩潰信息的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

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

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

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

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

主要使用的方法是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();
 }

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

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

總結

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

相關文章

  • android panellistview 圓角實現(xiàn)代碼

    android panellistview 圓角實現(xiàn)代碼

    android panellistview 圓角是每一個android開發(fā)者都具備的一項,對于新手朋友來說可能有點難度,接下來將詳細介紹,需要了解的朋友可以參考下
    2012-12-12
  • Android中Bitmap用法實例分析

    Android中Bitmap用法實例分析

    這篇文章主要介紹了Android中Bitmap用法,結合實例形式分析了Android操作圖片的載入、屬性設置、旋轉等相關技巧,需要的朋友可以參考下
    2016-02-02
  • 詳解Android的網(wǎng)絡數(shù)據(jù)存儲

    詳解Android的網(wǎng)絡數(shù)據(jù)存儲

    LeanCloud是一種簡單高效的數(shù)據(jù)和文件存儲服務,本文主要介紹了利用LeanCloud來進行網(wǎng)絡數(shù)據(jù)的存儲的實現(xiàn)方法。具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • android webview中使用Java調用JavaScript方法并獲取返回值

    android webview中使用Java調用JavaScript方法并獲取返回值

    這篇文章主要介紹了android webview中使用Java調用JavaScript方法并獲取返回值,本文直接給出代碼示例,需要的朋友可以參考下
    2015-03-03
  • android車牌識別系統(tǒng)EasyPR使用詳解

    android車牌識別系統(tǒng)EasyPR使用詳解

    這篇文章主要為大家詳細介紹了android車牌識別系統(tǒng)EasyPR使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android編程實現(xiàn)動畫自動播放功能

    Android編程實現(xiàn)動畫自動播放功能

    這篇文章主要介紹了Android編程實現(xiàn)動畫自動播放功能,結合實例形式分析了Android動畫自動播放功能的實現(xiàn)方法與相關注意事項,需要的朋友可以參考下
    2017-07-07
  • Android接入USB掃碼模塊的方法

    Android接入USB掃碼模塊的方法

    這篇文章主要為大家詳細介紹了Android接入USB掃碼模塊的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android錄音應用實例教程

    Android錄音應用實例教程

    這篇文章主要介紹了Android錄音應用實例,是Android應用程序開發(fā)中非常重要的一個功能,需要的朋友可以參考下
    2014-09-09
  • Android 開發(fā)之dataBinding與ListView及事件

    Android 開發(fā)之dataBinding與ListView及事件

    這篇文章主要介紹了Android 開發(fā)之dataBinding與ListView及事件的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Android實現(xiàn)淘寶倒計時功能

    Android實現(xiàn)淘寶倒計時功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)淘寶倒計時,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評論