詳解Android全域性異常的捕獲處理

NO IMAGE

在Android開發中在所難免的會出現程式crash,俗稱崩潰。使用者的隨意性訪問出現測試時未知的Bug導致我們的程式crash,此時我們是無法直接獲取的錯誤log的,也就無法修復Bug。這就會極大的影響使用者體驗,此時我們需要註冊一個功能來捕獲全域性的異常資訊,當程式出現crash資訊,我們把錯誤log記錄下來,上傳到伺服器,以便於我們能及時修復bug。實現這個功能我們需要依賴於UncaughtExceptionHandler這個類,UncaughtExceptionHandler是一個介面,在Thread中。裡面只有一個方法uncaughtException。當我們註冊一個UncaughtExceptionHandler之後,當我們的程式crash時就會回撥uncaughtException方法,而uncaughtException方法帶有兩個引數,引數中就存放這crash資訊。接下來只看寫程式碼


package hi.xiaoyu.crashhandler;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.Date;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

public class CrashHandler implements UncaughtExceptionHandler {

  private static CrashHandler instance;

  public static CrashHandler getInstance() {
    if (instance == null) {
      instance = new CrashHandler();
    }
    return instance;
  }

  public void init(Context ctx) {
    Thread.setDefaultUncaughtExceptionHandler(this);
  }

  /**
   * 核心方法,當程式crash 會回撥此方法, Throwable中存放這錯誤日誌
   */
  @Override
  public void uncaughtException(Thread arg0, Throwable arg1) {

    String logPath;
    if (Environment.getExternalStorageState().equals(
        Environment.MEDIA_MOUNTED)) {
      logPath = Environment.getExternalStorageDirectory()
          .getAbsolutePath()
            File.separator
            File.separator
            "log";

      File file = new File(logPath);
      if (!file.exists()) {
        file.mkdirs();
      }
      try {
        FileWriter fw = new FileWriter(logPath   File.separator
              "errorlog.log", true);
        fw.write(new Date()   "\n");
        // 錯誤資訊
        // 這裡還可以加上當前的系統版本,機型型號 等等資訊
        StackTraceElement[] stackTrace = arg1.getStackTrace();
        fw.write(arg1.getMessage()   "\n");
        for (int i = 0; i < stackTrace.length; i  ) {
          fw.write("file:"   stackTrace[i].getFileName()   " class:"
                stackTrace[i].getClassName()   " method:"
                stackTrace[i].getMethodName()   " line:"
                stackTrace[i].getLineNumber()   "\n");
        }
        fw.write("\n");
        fw.close();
        // 上傳錯誤資訊到伺服器
        // uploadToServer();
      } catch (IOException e) {
        Log.e("crash handler", "load file failed...", e.getCause());
      }
    }
    arg1.printStackTrace();
    android.os.Process.killProcess(android.os.Process.myPid());
  }

}

在Activity或者Application中註冊一下即可


CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());

這樣就實現了Android全域性異常的捕獲處理,實現過程也比較簡單,希望對大家學習Android軟體程式設計有所幫助。

您可能感興趣的文章:

Android崩潰異常捕獲方法Android 全域性異常捕獲例項詳解Android CrashHandler編寫自己的異常捕獲的方法android 捕獲系統異常並上傳日誌具體實現logcat命令使用方法和檢視android系統日誌緩衝區內容的方法android輕鬆管理安卓應用中的log日誌 釋出應用時log日誌全部去掉的方法Android開發之在程式中時時獲取logcat日誌資訊的方法(附demo原始碼下載)Android 日誌系統Logger原始碼詳細介紹Android 日誌工具(log)的使用方法Android程式設計實現專案中異常捕獲及對應Log日誌檔案儲存功能