1. 程式人生 > >Android中處理崩潰異常(存到本地)

Android中處理崩潰異常(存到本地)

同時推薦一款第三方的Crash工具  https://bugly.qq.com

大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程式釋出出去之後,如果出現了崩潰現象,開發者應該及時獲取在該裝置上導致崩潰的資訊,這對於下一個版本的bug修復幫助極大,所以今天就來介紹一下如何在程式崩潰的情況下收集相關的裝置引數資訊和具體的異常資訊,併發送這些資訊到伺服器供開發者分析和除錯程式。

我們先建立一個crash專案,專案結構如圖:

在MainActivity.

Java程式碼中,程式碼是這樣寫的:

  1. package com.scott.crash;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. publicclass MainActivity extends Activity {  
  5.     private String s;  
  6.     @Override
  7.     publicvoid onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         System.out.println(s.equals("any string"));  
  10.     }  
  11. }  

 我們在這裡故意製造了一個潛在的執行期異常,當我們執行程式時就會出現以下介面:

遇到軟體沒有捕獲的異常之後,系統會彈出這個預設的強制關閉對話方塊。

我們當然不希望使用者看到這種現象,簡直是對使用者心靈上的打擊,而且對我們的bug的修復也是毫無幫助的。我們需要的是軟體有一個全域性的異常捕獲器,當出現一個我們沒有發現的異常時,捕獲這個異常,並且將異常資訊記錄下來,上傳到伺服器公開發這分析出現異常的具體原因。

接下來我們就來實現這一機制,不過首先我們還是來了解以下兩個類:android.app.Application和java.lang.Thread.UncaughtExceptionHandler。

Application:用來管理應用程式的全域性狀態。在應用程式啟動時Application會首先建立,然後才會根據情況(Intent)來啟動相應的Activity和Service。本示例中將在自定義加強版的Application中註冊未捕獲異常處理器。

Thread.UncaughtExceptionHandler:執行緒未捕獲異常處理器,用來處理未捕獲異常。如果程式出現了未捕獲異常,預設會彈出系統中強制關閉對話方塊。我們需要實現此介面,並註冊為程式中預設未捕獲異常處理。這樣當未捕獲異常發生時,就可以做一些個性化的異常處理操作。

大家剛才在專案的結構圖中看到的CrashHandler.java實現了Thread.UncaughtExceptionHandler,使我們用來處理未捕獲異常的主要成員,程式碼如下:

  1. package com.scott.crash;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.PrintWriter;  
  5. import java.io.StringWriter;  
  6. import java.io.Writer;  
  7. import java.lang.Thread.UncaughtExceptionHandler;  
  8. import java.lang.reflect.Field;  
  9. import java.text.DateFormat;  
  10. import java.text.SimpleDateFormat;  
  11. import java.util.Date;  
  12. import java.util.HashMap;  
  13. import java.util.Map;  
  14. import android.content.Context;  
  15. import android.content.pm.PackageInfo;  
  16. import android.content.pm.PackageManager;  
  17. import android.content.pm.PackageManager.NameNotFoundException;  
  18. import android.os.Build;  
  19. import android.os.Environment;  
  20. import android.os.Looper;  
  21. import android.util.Log;  
  22. import android.widget.Toast;  
  23. /** 
  24.  * UncaughtException處理類,當程式發生Uncaught異常的時候,有該類來接管程式,並記錄傳送錯誤報告. 
  25.  *  
  26.  * @author user 
  27.  *  
  28.  */
  29. publicclass CrashHandler implements UncaughtExceptionHandler {  
  30.     publicstaticfinal String TAG = "CrashHandler";  
  31.     //系統預設的UncaughtException處理類 
  32.     private Thread.UncaughtExceptionHandler mDefaultHandler;  
  33.     //CrashHandler例項
  34.     privatestatic CrashHandler INSTANCE = new CrashHandler();  
  35.     //程式的Context物件
  36.     private Context mContext;  
  37.     //用來儲存裝置資訊和異常資訊
  38.     private Map<String, String> infos = new HashMap<String, String>();  
  39.     //用於格式化日期,作為日誌檔名的一部分
  40.     private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");  
  41.     /** 保證只有一個CrashHandler例項 */
  42.     private CrashHandler() {  
  43.     }  
  44.     /** 獲取CrashHandler例項 ,單例模式 */
  45.     publicstatic CrashHandler getInstance() {  
  46.         return INSTANCE;  
  47.     }  
  48.     /** 
  49.      * 初始化 
  50.      *  
  51.      * @param context 
  52.      */
  53.     publicvoid init(Context context) {  
  54.         mContext = context;  
  55.         //獲取系統預設的UncaughtException處理器
  56.         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  
  57.         //設定該CrashHandler為程式的預設處理器
  58.         Thread.setDefaultUncaughtExceptionHandler(this);  
  59.     }  
  60.     /** 
  61.      * 當UncaughtException發生時會轉入該函式來處理 
  62.      */
  63.     @Override
  64.     publicvoid uncaughtException(Thread thread, Throwable ex) {  
  65.         if (!handleException(ex) && mDefaultHandler != null) {  
  66.             //如果使用者沒有處理則讓系統預設的異常處理器來處理
  67.             mDefaultHandler.uncaughtException(thread, ex);  
  68.         } else {  
  69.             try {  
  70.                 Thread.sleep(3000);  
  71.             } catch (InterruptedException e) {  
  72.                 Log.e(TAG, "error : ", e);  
  73.             }  
  74.             //退出程式
  75.             android.os.Process.killProcess(android.os.Process.myPid());  
  76.             System.exit(1);  
  77.         }  
  78.     }  
  79.     /** 
  80.      * 自定義錯誤處理,收集錯誤資訊 傳送錯誤報告等操作均在此完成. 
  81.      *  
  82.      * @param ex 
  83.      * @return true:如果處理了該異常資訊;否則返回false. 
  84.      */
  85.     privateboolean handleException(Throwable ex) {  
  86.         if (ex == null) {  
  87.             returnfalse;  
  88.         }  
  89.         

    相關推薦

    [Android UI開發] Android處理崩潰異常

    大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程式釋出出去之後,如果出現了崩潰現象,開發者應該及時獲取在該裝置上導致崩潰的資訊,這對於下一個版

    Android處理崩潰異常

    大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程式釋出出去之後,如果出現了崩潰現象,開發者應該及時獲取在該裝置上導致崩潰的資訊,這對於下一個版本的b

    android 處理崩潰異常並重啟程式

    有時候由於測試不充分或者程式潛在的問題而導致程式異常崩潰,這個是令人無法接受的,在Android中怎樣捕獲程式的異常崩潰,然後進行一些必要的處理或重新啟動 應用這個問題困惱了我很久,今天終於解決了該問題,寫篇文章記錄一下。 首先捕獲程式崩潰的異常就必須瞭解一下Java

    Android實戰】Android處理崩潰異常

    public class MainActivity extends ActionBarActivity { public CrashApplication application; @Override protected void onCreate(Bundle

    Android處理崩潰異常(本地)

    同時推薦一款第三方的Crash工具  https://bugly.qq.com 大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程

    Android出來崩潰異常捕獲

    現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯。 這對於下一個版本的bug修復幫助極大,所以今天就來介紹一下如何在程式崩潰的情況下收集相關的裝置引數資訊和具體的異常資訊

    Android處理大圖片時圖片壓縮

    oca 內存空間 pan std ret bitmap sans source tar 1、BitmapFactory.Options中的屬性 在進行圖片壓縮時,是通過設置BitmapFactory.Options的一些值來改變圖片的屬性的,以下我們來看看BitmapF

    android webview處理h5打開本地文件瀏覽器的功能

    utility || 簡單的 mfile () 怎樣 測試的 params 後來 這周遇到一個比較棘手的問題,需要在android上邊集成h5頁面,並且在h5頁面上,需要用戶能夠上傳android本地的照片,一開始我以為webview會自動處理掉的,因此沒太留意,當真正集成

    Android Crash處理 崩潰後禁止預設重啟與崩潰後手動重啟

    轉載自:https://juejin.im/post/5a321db5f265da431b6d38ff 伸手黨福利:compile 'com.tuzhenlei:crashhandler:1.0.1' 詳情參見文件和demo:github地址 /**簡單初始化*/ //Cr

    Android使App快速 簡單地支援新浪微博 微信 QQ facebook等十幾個主流社交平臺的分享功能

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    Android常見的異常

    空指標異常 這個是新手最容易碰到的異常,但是也是最容易解決的異常,沒有之一 'java.lang.NullPointerException': Attempt to invoke virtual method 'void android.widget.TextView.

    android初學筆記,android處理button click事件的幾種寫法

    介紹了給button設定click Listener的幾種寫法: 1:最簡單的是將處理該button點選事件的函式名字繫結到xml標籤上: <Button android:id="@+id/button1" android:layo

    Android全域性捕獲崩潰異常記錄日誌儲存至本地並定時刪除

    MainActivity內的程式碼如下:package com.example.mycrashtest; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widg

    Android處理軟鍵盤上“回車鍵”的2種方法

    程式設計必須有個喜歡總結的習慣, 總結了才能進步,雖然總結的內容不多。但是我要總結。 一方便留著自己以後觀看學習,另一方面總結的都是我自己實踐過的東西,這樣才記得牢。 這裡總結單擊“回車鍵”隱藏軟鍵盤的方法。 1. 給EditText設定屬性【android:imeOpti

    Android崩潰處理異常收集

    目前為止也經歷了好幾個專案了,每個專案都會避免不了crash。這裡就總結一下專案的異常處理。下面介紹一下系統提供的異常處理方法。 1.系統異常處理類。 /** * Interface for handlers invoked when a <tt>T

    Android程式崩潰異常處理框架

    目前我已經把框架放在了github了,地址如下:https://github.com/msdx/android-crash 使用方法見github上面的README.md。 本專案相關jar包已釋出在jcenter,如果你使用gradle構建工具,可以直接新增依賴,具體見

    AdMob在Android的回撥造成崩潰處理方式

    遊戲開發總是要接入各種各樣的SDK,廣告也成了一種常用的變現方式。而AdMob對於遊戲開發的老鳥來說一定不會陌生。 AdMob for Unity RewardBasedVideoAd.Instance.OnAdFailedToLoad; RewardBa

    Android使用UncaughtExceptionHandler來處理未捕獲的異常

    所有的App都會發生crash,本文講解的是如何採集crash資訊以供後續開發處理這類問題。 基本思路 當crash發生時,系統會呼叫UncaughtExceptionHandler的uncaughtException方法,我們可以在這個方法中捕獲異常資

    nodejs處理回調函數的異常

    out dom tac rip ack javascrip java logger exception 假設是使用nodejs+express3這個經典的組合。那麽有一種非常方面的處理回調函數異常的方法: 1. 安裝模塊:express-domain-middlew

    Android 圖能夠用到的圖片處理類 BitmapUtils

    andro radius title can rup decode eww row 上下 Android在實際開發中非常多時候都要對圖片進行一定的處理,這裏總結的BitmapUtils 類包含一下幾個功能: 1.Android圖片倒影, 2.Android圖片模糊處理,