需求:按當前項目工程的組織結構,業務模塊被分爲多個獨立的Module,要求當業務模塊內發生未捕獲到的局部異常時,不重啓整個應用,只是單獨重啓某個異常的業務模塊oop
目前安卓中經常使用的異常捕獲有兩種方式:線程
一種是局部異常捕獲,使用try catch包括目標代碼塊對象
一種是使用Thread.setDefaultUncaughtExceptionHandler捕獲全局異常,但主線程發生異常使用此種方式捕獲,應用必將崩潰或重啓,沒法作到只重啓某業務模塊it
顯然兩種方式都沒法知足需求,那麼此時還有另一種出現全局異常不崩潰,更優雅的異常處理方式:io
接管主線程的Looper.loop()方法,而且使用try catch包括它,判斷業務模塊的包名,重啓目標業務模塊,完美知足需求循環
安卓應用啓動時,會初始化ActivityThread對象,調用其main方法,在main方法中又調用了Looper.loop()方法,來開啓消息循環,處理全部主線程操做方法
主線程所發生的全部異常,追蹤其源頭都是Looper.loop方法,接管該方法,便可將主線程出現的任何異常都正確捕獲處理了,那麼子線程呢項目
你們都知道子線程默認是沒有Looper的,此時能夠用捕獲全局異常的方式來處理子線程的異常,由於子線程出現異常,通常也都沒法繼續運行了,因此能夠用全局異常處理,而且全局捕獲子線程異常,不會致使應用崩潰異常
兩種方式相結合,能夠處理應用中的全部異常,並使應用可以正常運行下去。異常處理