標籤:
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接管異常處理?