62、在app遇到全域異常時避免直接退出,如何讓app接管異常處理?

來源:互聯網
上載者:User

標籤:

1、建立一個類為CrashHandler

  1 import android.content.Context;  2 import android.os.Looper;  3 import android.util.Log;  4 import android.widget.Toast;  5   6 import java.text.DateFormat;  7 import java.text.SimpleDateFormat;  8 import java.util.Locale;  9  10 /** 11  * author: Created by zzl on 15/11/3. 12  */ 13 public class CrashHandler implements Thread.UncaughtExceptionHandler { 14     private static final String TAG = CrashHandler.class.getSimpleName(); 15  16     private static CrashHandler instance; // 單例模式 17  18     private Context context; // 程式Context對象 19     private Thread.UncaughtExceptionHandler defalutHandler; // 系統預設的UncaughtException處理類 20     private DateFormat formatter = new SimpleDateFormat( 21             "yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA); 22  23     private CrashHandler() { 24  25     } 26  27     /** 28      * 擷取CrashHandler執行個體 29      * 30      * @return CrashHandler 31      */ 32     public static CrashHandler getInstance() { 33         if (instance == null) { 34             synchronized (CrashHandler.class) { 35                 if (instance == null) { 36                     instance = new CrashHandler(); 37                 } 38             } 39         } 40  41         return instance; 42     } 43  44     /** 45      * 異常處理初始化 46      * 47      * @param context 48      */ 49     public void init(Context context) { 50         this.context = context; 51         // 擷取系統預設的UncaughtException處理器 52         defalutHandler = Thread.getDefaultUncaughtExceptionHandler(); 53         // 設定該CrashHandler為程式的預設處理器 54         Thread.setDefaultUncaughtExceptionHandler(this); 55     } 56  57     /** 58      * 當UncaughtException發生時會轉入該函數來處理 59      */ 60     @Override 61     public void uncaughtException(Thread thread, Throwable ex) { 62  63         // 自訂錯誤處理 64         boolean res = handleException(ex); 65         if (!res && defalutHandler != null) { 66             // 如果使用者沒有處理則讓系統預設的異常處理器來處理 67             defalutHandler.uncaughtException(thread, ex); 68  69         } else { 70             try { 71                 Thread.sleep(3000); 72             } catch (InterruptedException e) { 73                 Log.e(TAG, "error : ", e); 74             } 75             // 退出程式 76             //android.os.Process.killProcess(android.os.Process.myPid()); 77             //System.exit(1); 78         } 79     } 80  81     /** 82      * 自訂錯誤處理,收集錯誤資訊 發送錯誤報表等操作均在此完成. 83      * 84      * @param ex 85      * @return true:如果處理了該異常資訊;否則返回false. 86      */ 87     private boolean handleException(final Throwable ex) { 88         if (ex == null) { 89             return false; 90         } 91  92         new Thread() { 93  94             @Override 95             public void run() { 96                 Looper.prepare(); 97  98                 ex.printStackTrace(); 99                 String err = "[" + ex.getMessage() + "]";100                 Toast.makeText(context, "程式出現異常." + err, Toast.LENGTH_LONG)101                         .show();102 103                 Looper.loop();104             }105 106         }.start();107 108         // 收集裝置參數資訊 \日誌資訊109         return true;                                                                                                                }110 }

 

 

2、在Application的onCreate()裡執行個體化改crashHandler

1     @Override2     public void onCreate() {3         super.onCreate();4         initInformData();5         mContext = getApplicationContext();6         CrashHandler crashHandler = CrashHandler.getInstance();7         crashHandler.init(mContext);8 9     }

 

這樣當APP遇到未捕獲的異常時,便不會直接閃退,具體怎麼處理就看開發人員根據業務需要自己處理了。

 

62、在app遇到全域異常時避免直接退出,如何讓app接管異常處理?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.