Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> 定制自己的Android日志系統

定制自己的Android日志系統

編輯:Android編程入門

前言:

每當我們app測試的時候,測試人員總是對我們說這裡崩潰了,那裡掛掉了!我們只能默默接受,然後嘗試著重現bug,更可悲的是有時候bug很難復現,為了解決這種現狀所以我們要嘗試這建立一個自己的bug日志系統。

實現原理:

Java為我們提供了一個機制,用來捕獲並處理在一個線程對象中拋出的未檢測異常,以避免程序終止。我們可以通過UncaughtExceptionHandler來實現這種機制。

 

具體實現:

public class CrashManager implements UncaughtExceptionHandler {
    public static final String TAG = "CrashHandler";
    // CrashHandler實例
    private static CrashManager instance;
    // 程序的Context對象
    private Application application;
    // 系統默認的UncaughtException處理類
    private UncaughtExceptionHandler mDefaultHandler;

    /**
     * 保證只有一個CrashHandler實例
     */
    private CrashManager(Context context) {
        application = (Application) context.getApplicationContext();
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 獲取CrashHandler實例 ,單例模式
     */
    public static CrashManager getInstance(Context context) {
        CrashManager inst = instance;
        if (inst == null) {
            synchronized (CrashManager.class) {
                inst = instance;
                if (inst == null) {
                    inst = new CrashManager(context.getApplicationContext());
                    instance = inst;
                }
            }
        }
        return inst;
    }

    /**
     * 當UncaughtException發生時會轉入該函數來處理
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        TaskManager.getInstance(application).saveErrorLog(ex);
        mDefaultHandler.uncaughtException(thread, ex);
    }

}

日志寫入sdcard代碼:

public class SaveErrorTask<T> extends Task<Object, Object, Void> {
    private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.CHINA);
    private Context context;
    private Throwable ex;

    public SaveErrorTask(Context context, Throwable ex) {
        setPriority(TaskPriority.UI_LOW);
        this.context = context;
        this.ex = ex;
    }

    @Override
    protected Void doInBackground(Object... arg0) {
        Writer writer = new StringWriter();
        PrintWriter printWriter = new PrintWriter(writer);
        ex.printStackTrace(printWriter);
        Throwable cause = ex.getCause();
        while (cause != null) {
            cause.printStackTrace(printWriter);
            cause = cause.getCause();
        }
        printWriter.close();
        String result = writer.toString();
        String time = formatter.format(new Date());
        String fileName = time + ".txt";
        StringBuilder stringBuffer = new StringBuilder();
        DeviceInfo deviceInfo = Utils.getDeviceInfo(context);
        stringBuffer.append("\nsdkVersion:" + deviceInfo.sdkVersion);
        stringBuffer.append("\nmanufacturer:" + deviceInfo.manufacturer);
        stringBuffer.append("\nmodel:" + deviceInfo.model);
        stringBuffer.append("\nversion" + ConfigManager.getVersionName(context));
        stringBuffer.append("\nerrorStr:" + result);
        stringBuffer.append("\ntime:" + time);
        String filePath = CacheFileUtils.getLogPath(fileName);
        CacheFileUtils.saveErrorStr(filePath, stringBuffer.toString());
        return null;
    }
}

展望:我們也可以把日志再下次啟動的時候發送至我們自己的日志服務器,監控用戶錯誤信息

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved