Android中全局異常的捕獲

應用的crash是讓人很蛋疼的問題,在開發測試的時候還能根據日志輸出什么的進行排查修復,但是應用發布以后,用戶的隨意性訪問出現測試時未知的Bug導致我們的程序crash,此時我們是無法直接獲取的錯誤log的,也就無法修復Bug。所以這時候我們就需要一個能全局捕獲異常,并且將這個異常信息上傳到服務器的功能,以便根據收集到的異常信息,在后期的版本中進行修復,改善用戶體驗。

UncaughtExceptionHandler

實現這個功能我們只要自定義一個實現了Thread.UncaughtExceptionHandler接口的異常處理類,并在應用初始化的時候注冊這個類就可以了。

public class CrashHandler implements Thread.UncaughtExceptionHandler
{

    private static CrashHandler ourInstance = new CrashHandler();

    public static CrashHandler getInstance()
    {
        return ourInstance;
    }

    private CrashHandler()
    {
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
     //TODO
    }
}

這邊呢,我們一般將CrashHandler寫成單例模式,重寫上面的uncaughtException方法自定義對異常的處理,然后呢,Application或者Activity的onCreate方法里注冊這個異常處理類就可以了

Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance());

這邊呢再貼一點uncaughtException中處理異常的代碼,給大家參考一下

public void uncaughtException(Thread thread, Throwable ex)
{

    
    dumpEx2SdCard(ex);//將錯誤日志導入到SD卡中
    upEx2server();//將日志上傳到服務器
    if (mDefaultHandler != null)
    {
        mDefaultHandler.uncaughtException(thread, ex);
    }
    else
    {
        Process.killProcess(Process.myPid());//做一些退出或者提醒處理
    }
}

private void dumpEx2SdCard(Throwable ex)
{
         //...
        PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)));
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
        ex.printStackTrace(printWriter);
        printWriter.print(ex.getCause());
        printWriter.print(time);
        printWriter.print(ex.getMessage());
        printWriter.print("APP版本:"+ packageInfo.versionName+"_"+packageInfo.versionCode);
        printWriter.print("android 版本:"+ Build.VERSION.RELEASE+"_"+Build.VERSION.SDK_INT);
        printWriter.print("制造商:"+Build.MANUFACTURER);
        //...
}

一般這邊的代碼都是將錯誤日志和設備信息寫到SD卡中然后再上傳到服務器中,具體實現就不貼那么多的代碼啦,注重流程就是啦。

開發者服務

集成一些第三方服務可以大大的加快我們的開發速度,諸如此類的統計功能我們只要集成一些像百度云推送,極光推送,友盟+等等的第三方SDK,然后做一些初始化,幾行代碼就搞定了。而且這些平臺提供的各種強大方便的服務,確實是我們開發者的福音。像下圖展示的友盟應用管理中心,各種統計功能基本上都能滿足我們的需求了。

再推薦一個網站。DevStore 移動互聯網企業運營解決方案整合平臺這里面總結了各種強大的第三方服務平臺,建議收藏哦。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,268評論 25 708
  • 《騰訊桌球:客戶端總結》 本次分享總結,起源于騰訊桌球項目,但是不僅僅限于項目本身。雖然基于Unity3D,很多東...
    吳秦閱讀 24,674評論 12 142
  • 其實還是會想念。 人總是很奇怪再分開之后腦子里都是以前的美好。 但是不會再聯系。 因為知道當初那個痛哭流涕的自己,...
    Myheng_a3d7閱讀 207評論 0 0
  • 賈平凹先生的文章只是零零散散的讀過,此本書完全出于對標題的喜愛。是的,目前除了王小波和林清玄的書是對于作者的...
    鄭欣然閱讀 1,406評論 0 0
  • 過幾天又要到端午了,兩年沒有在家過節,很想念那個小山城的那天下午。今年又回不去,又一次只能用回憶來填補想家的...
    羊一豪閱讀 304評論 2 1