真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在Android中使用CrashHandler獲取應(yīng)用的crash信息

如何在Android中使用CrashHandler獲取應(yīng)用的crash信息?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)是一家成都網(wǎng)站建設(shè)、做網(wǎng)站,提供網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,建網(wǎng)站,按需定制,網(wǎng)站開發(fā)公司,從2013年創(chuàng)立是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價(jià)值為核心業(yè)務(wù),全程參與項(xiàng)目的網(wǎng)站策劃設(shè)計(jì)制作,前端開發(fā),后臺(tái)程序制作以及后期項(xiàng)目運(yùn)營并提出專業(yè)建議和思路。

一、Thread 類中的 setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {  
  Thread.defaultUncaughtHandler = handler;  
}

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

二、實(shí)現(xiàn)自己的異常捕獲類

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

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

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

三、如何使用 CrashHandler

其實(shí)使用 CrashHandler 也非常簡單,我們可以在 Application 初始化的時(shí)候來設(shè)置 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); 
  } 
}

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


網(wǎng)站名稱:如何在Android中使用CrashHandler獲取應(yīng)用的crash信息
網(wǎng)站鏈接:http://weahome.cn/article/jdpdso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部