1. 程式人生 > >詳解Android全域性異常的捕獲處理

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

這篇文章主要為大家介紹了Android全域性異常的捕獲處理,為什麼要進行捕獲處理,如何進行捕獲處理,想要了解的朋友可以參考一下

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

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");
            } 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軟體程式設計有所幫助。