在Android應用開發中,偶爾會因為測試的不充分導致一些異常沒有被捕獲,這時應用會出現異常並強制關閉,這樣會導致很不好的用戶體驗,為了解決這個問題,我們需要捕獲相關的異常並做處理。
首先捕獲程序崩潰的異常就必須了解一下Java中UncaughtExceptionHandler這個接口,這個接口在Android開發上面也是可以使用的,在API文檔中,我們可以了解到:通過實現此接口,能夠處理線程被一個無法捕獲的異常所終止的情況。如上所述的情況,handler將會報告線程終止和不明原因異常這個情況,如果沒有自定義handler, 線程管理組就被默認為報告異常的handler。 ThreadGroup 這個類就是實現了UncaughtExceptionHandler這個接口,如果想捕獲異常我們可以實現這個接口或者繼承ThreadGroup,並重載uncaughtException方法。
UnCeHandler具體實現:
/** * Created by dingchao on 2018/3/23. */ /*處理崩潰重疊*/ public class UnCeHandler implements Thread.UncaughtExceptionHandler { private Thread.UncaughtExceptionHandler mDefaultHandler; public static final String TAG = "CatchExcep"; AppApplication application; public UnCeHandler(AppApplication application){ //獲取系統默認的UncaughtException處理器 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); this.application = application; } @Override public void uncaughtException(Thread thread, Throwable ex) { if(!handleException(ex) && mDefaultHandler != null){ //如果用戶沒有處理則讓系統默認的異常處理器來處理 mDefaultHandler.uncaughtException(thread, ex); }else{ try{ Thread.sleep(2000); }catch (InterruptedException e){ Log.e(TAG, "error : ", e); } Intent intent = new Intent(application.getApplicationContext(), MainActivity.class); PendingIntent restartIntent = PendingIntent.getActivity( application.getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); //退出程序 AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒鍾后重啟應用 application.finishActivity(); } } /** * 自定義錯誤處理,收集錯誤信息 發送錯誤報告等操作均在此完成. * * @param ex * @return true:如果處理了該異常信息;否則沒有處理返回false. */ private boolean handleException(Throwable ex) { if (ex == null) { return false; } //使用Toast來顯示異常信息 new Thread(){ @Override public void run() { Looper.prepare(); Toast.makeText(application.getApplicationContext(), "很抱歉,程序出現異常,即將退出.", Toast.LENGTH_SHORT).show(); Looper.loop(); } }.start(); return true; } }
在Application中的onCreate()中
//設置該CrashHandler為程序的默認處理器 UnCeHandler catchExcep = new UnCeHandler(this); Thread.setDefaultUncaughtExceptionHandler(catchExcep);
/** * Activity關閉時,刪除Activity列表中的Activity對象*/ public void removeActivity(Activity a){ list.remove(a); } /** * 向Activity列表中添加Activity對象*/ public void addActivity(Activity a){ list.add(a); } /** * 關閉Activity列表中的所有Activity*/ public void finishActivity(){ for (Activity activity : list) { if (null != activity) { activity.finish(); } } //殺死該應用進程 android.os.Process.killProcess(android.os.Process.myPid()); }
以上可實現的在程序崩潰時提示出現異常即將退出然后重新啟動app,在你重啟之后頁面如果是嵌套的Fragment會出現重疊現象,參考
http://www.cnblogs.com/dingxiansen/p/8628523.html
在嵌套的Activity中重寫一個空方法就ok
