亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android使用CrashHandler來獲取應用的crash信息的方法

 更新時間:2017年09月29日 14:12:24   作者:QDJdeveloper  
本篇文章主要介紹了Android使用CrashHandler來獲取應用的crash信息的方法,具有一定的參考價值,有興趣的可以了解一下

在日常開發(fā)的過程中應該不可避免的會發(fā)生 crash,無論你的程序寫的多么完美,都不可能完全避免 crash 的發(fā)生,可能是由于 Android 底層的 bug,也可能是由于不充分的機型適配或者是糟糕的網絡狀況。當 crash 發(fā)生時,系統(tǒng)就會kill掉正在執(zhí)行的程序,現象就是閃退,或者提醒用戶程序已經停止運行,這對用戶來說是很不友好的,也是我們不愿意看到的,更早的是當用戶發(fā)生 crash,我們開發(fā)者卻無法得知程序為何 crash,即便我們想去解決這個 bug,但是由于無法知道用戶當時的 crash 信息,所以往往也無能為力,幸運的是,Andorid 提供了處理這類問題的方法,接下來我們就來一起看看到底 Android 給我們提供了什么方法來解決這個棘手的問題

一、Thread 類中的 setDefaultUncaughtExceptionHandler

/** 
 * Sets the default uncaught exception handler. This handler is invoked in 
 * case any Thread dies due to an unhandled exception. 
 * 
 * @param handler 
 *      The handler to set or null. 
 */  
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {  
  Thread.defaultUncaughtHandler = handler;  
}  

這個方法其實就可以解決我們應用程序的 crash 問題,設置系統(tǒng)默認異常處理器,當系統(tǒng)發(fā)生crash 時,系統(tǒng)就會回調 UncaughtExceptionHandler 的 uncaughtException 方法,在 uncaughtException 方法中就可以獲取到異常信息,可以選擇把異常信息存儲下來,存儲方式大家可以自己選擇,然后在合適的時候通過網絡將 crash 信息上傳到服務器上,這樣我們開發(fā)人員就可以分析用戶 crash 的場景從而在后面的版本中進行修復,我們還可以在發(fā)生 crash 發(fā)生時彈出一個對話框,告訴用戶程序 crash 了,然后再退出

二、實現自己的異常捕獲類

1)建立異常 Handler,命名為 CrashHandler,代碼如下

/** 
 * 異常捕獲類 
 * Created by qiudengjiao on 2017/9/29. 
 */ 
 
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() + "/ryg_test/log/"; 
  private static final String FILE_NAME = "crash"; 
 
  //log文件的后綴名 
  private static final String FILE_NAME_SUFFIX = ".trace"; 
 
  private static CrashHandler sInstance = new CrashHandler(); 
 
  //系統(tǒng)默認的異常處理(默認情況下,系統(tǒng)會終止當前的異常程序) 
  private Thread.UncaughtExceptionHandler mDefaultCrashHandler; 
 
  private Context mContext; 
 
  //構造方法私有,防止外部構造多個實例 
  private CrashHandler() { 
  } 
 
  public static CrashHandler getInstance() { 
    return sInstance; 
  } 
 
  /** 
   * 初始化 
   * 
   * @param context 
   */ 
 
  public void init(Context context) { 
    //獲取系統(tǒng)默認的異常處理器 
    mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler(); 
    //將當前實例設為系統(tǒng)默認的異常處理器 
    Thread.setDefaultUncaughtExceptionHandler(this); 
    //獲取Context,方便內部使用 
    mContext = context.getApplicationContext(); 
  } 
 
  /** 
   * 這個是最關鍵的函數,當程序中有未被捕獲的異常,系統(tǒng)將會自動調用#uncaughtException方法 
   * thread為出現未捕獲異常的線程,ex為未捕獲的異常,有了這個throwable,我們就可以得到異常信息 
   * 
   * @param thread 
   * @param throwable 
   */ 
  @Override 
  public void uncaughtException(Thread thread, Throwable throwable) { 
    try { 
      //導出異常信息到SD卡中 
      dumpExceptionToSDCard(throwable); 
      //這里可以通過網絡上傳異常信息到服務器,便于開發(fā)人員分析日志從而解決bug 
      uploadExceptionToServer(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
 
    //打印出當前調用棧信息 
    throwable.printStackTrace(); 
 
    //如果系統(tǒng)提供了默認的異常處理器,則交給系統(tǒng)去結束我們的程序,否則就由我們自己結束自己 
    if (mDefaultCrashHandler != null) { 
      mDefaultCrashHandler.uncaughtException(thread, throwable); 
    } else { 
      android.os.Process.killProcess(android.os.Process.myPid()); 
    } 
  } 
 
  /** 
   * 保存到內存卡 
   * 這里我們也可以根據項目需要選擇其他的保存方式 
   * 
   * @param throwable 
   * @throws IOException 
   */ 
  private void dumpExceptionToSDCard(Throwable throwable) throws IOException { 
    //如果SD卡不存在或無法使用,則無法把異常信息寫入SD卡 
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
      if (DEBUG) { 
        Log.w(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").format(new Date(current)); 
    //以當前時間創(chuàng)建log文件 
    File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX); 
 
    try { 
      PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); 
      //導出發(fā)生異常的時間 
      pw.println(time); 
 
      //導出手機信息 
      dumpPhoneInfo(pw); 
 
      pw.println(); 
      //導出異常的調用棧信息 
      throwable.printStackTrace(pw); 
 
      pw.close(); 
    } catch (Exception e) { 
      Log.e(TAG, "dump crash info failed"); 
    } 
  } 
 
  /** 
   * 收集設備參數信息 
   * 
   * @param pw 
   * @throws PackageManager.NameNotFoundException 
   */ 
  private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException { 
    //應用的版本名稱和版本號 
    PackageManager pm = mContext.getPackageManager(); 
    PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES); 
    pw.print("App Version: "); 
    pw.print(pi.versionName); 
    pw.print('_'); 
    pw.println(pi.versionCode); 
 
    //android版本號 
    pw.print("OS Version: "); 
    pw.print(Build.VERSION.RELEASE); 
    pw.print("_"); 
    pw.println(Build.VERSION.SDK_INT); 
 
    //手機制造商 
    pw.print("Vendor: "); 
    pw.println(Build.MANUFACTURER); 
 
    //手機型號 
    pw.print("Model: "); 
    pw.println(Build.MODEL); 
 
    //cpu架構 
    pw.print("CPU ABI: "); 
    pw.println(Build.CPU_ABI); 
  } 
 
  /** 
   * 將異常信息上傳到服務器 
   */ 
  private void uploadExceptionToServer() { 
    //在這里寫上傳到服務器的邏輯 
  } 
} 

從上面的代碼可以看出,當應用程序崩潰時,CrashHandler 類會將異常信息以及設備信息寫入 SD 卡,這里大家也可以根據自己項目需要進行處理,例如也可以存儲在數據庫中,接著將異常交給系統(tǒng)處理,系統(tǒng)會幫我們中止程序,如果系統(tǒng)沒有默認的異常處理機制,那么就自行中止,當然而又可以選擇將異常信息上傳到服務器,這里我們沒有實現這個邏輯,實際開發(fā)中都需要將異常信息上傳到服務器

三、如何使用 CrashHandler

其實使用 CrashHandler 也非常簡單,我們可以在 Application 初始化的時候來設置 CrashHandler,如下所示:

/** 
 * 自定義 Application 類 
 * Created by qiudengjiao on 2017/9/29. 
 */ 
 
public class App extends Application { 
  @Override 
  public void onCreate() { 
    super.onCreate(); 
    init(); 
  } 
 
  private void init() { 
    //初始化異常捕獲類 CrashHandler 
    CrashHandler.getInstance().init(this); 
  } 
} 

通過上面的操作,我們的程序就能捕獲到 crash 了,同時還能從服務器上查看用戶的 crash 信息,今天就寫到這里,給大家推薦一本不錯的書:Android 開發(fā)藝術,作者是任玉剛,相信大家也都知道,這本書的內容還是非常不錯的,值得大家一看,比較適合有一定 Android 基礎的同學,馬上就是國慶小長假了,祝大家國慶節(jié)愉快

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • ScrollView與SeekBar綁定實現滑動時出現小滑塊效果

    ScrollView與SeekBar綁定實現滑動時出現小滑塊效果

    這篇文章主要為大家詳細介紹了ScrollView與SeekBar綁定實現滑動時出現小滑塊效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Flutter?異步編程之單線程下異步模型圖文示例詳解

    Flutter?異步編程之單線程下異步模型圖文示例詳解

    這篇文章主要為大家介紹了Flutter?異步編程之單線程下異步模型圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android實現房貸計算器功能

    Android實現房貸計算器功能

    這篇文章主要為大家詳細介紹了Android實現房貸計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Android實現氣泡布局/彈窗效果 氣泡尖角方向及偏移量可控

    Android實現氣泡布局/彈窗效果 氣泡尖角方向及偏移量可控

    這篇文章主要為大家詳細介紹了Android實現氣泡布局/彈窗效果,可控制氣泡尖角方向及偏移量,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android開發(fā)筆記SQLite優(yōu)化記住密碼功能

    Android開發(fā)筆記SQLite優(yōu)化記住密碼功能

    這篇文章主要為大家詳細介紹了Android開發(fā)筆記SQLite優(yōu)化記住密碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android進程間通信(IPC)機制Binder簡要介紹

    Android進程間通信(IPC)機制Binder簡要介紹

    本文主要介紹 Android進程間通信(IPC)機制Binder簡要介紹, 這里介紹了Binder機制如何實現進程通信機制,有研究Android源碼的朋友可以看下
    2016-08-08
  • Android開發(fā)之利用Activity實現Dialog對話框

    Android開發(fā)之利用Activity實現Dialog對話框

    這篇文章主要給大家介紹了Android開發(fā)之如何利用Activity實現Dialog對話框效果,文中給出了詳細的示例代碼,相信對大家的理解及學習具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-12-12
  • 解決Android studio模擬器啟動失敗的問題

    解決Android studio模擬器啟動失敗的問題

    這篇文章主要介紹了Android studio模擬器啟動失敗的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android開發(fā)使用HttpURLConnection進行網絡編程詳解【附源碼下載】

    Android開發(fā)使用HttpURLConnection進行網絡編程詳解【附源碼下載】

    這篇文章主要介紹了Android開發(fā)使用HttpURLConnection進行網絡編程的方法,結合實例形式分析了Android基于HttpURLConnection實現顯示圖片與文本功能,涉及Android布局、文本解析、數據傳輸、權限控制等相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • Android用注解與反射實現Butterknife功能

    Android用注解與反射實現Butterknife功能

    Butterknife是一個在android上實現ioc(控制反轉)的一個庫。ioc的核心是解耦。解耦的目的是修改耦合對象時不影響另外一個對象,降低模塊之間的關聯(lián)。在Spring中ioc更多的是依靠xml的配置。而android上的IOC框架可以不使用xml配置
    2022-11-11

最新評論