一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

android 中處理崩潰異常并重啟程序

 天海544 2014-05-16

有時候由于測試不充分或者程序潛在的問題而導(dǎo)致程序異常崩潰,這個是令人無法接受的,在android中怎樣捕獲程序的異常崩潰,然后進(jìn)行一些必要的處理或重新啟動

應(yīng)用這個問題困惱了我很久,今天終于解決了該問題,寫篇文章記錄一下。

首先捕獲程序崩潰的異常就必須了解一下java中UncaughtExceptionHandler這個接口,android沿用了此接口,在android API中:


通過實(shí)現(xiàn)此接口,能夠處理線程被一個無法捕捉的異常所終止的情況。如上所述的情況,handler將會報告線程終止和不明原因異常這個情況,如果沒有自定義handler,

線程管理組就被默認(rèn)為報告異常的handler。

ThreadGroup 這個類就是實(shí)現(xiàn)了UncaughtExceptionHandler這個接口,如果想捕獲異常我們可以實(shí)現(xiàn)這個接口或者繼承ThreadGroup,并重載uncaughtException方法。

在java API中對該接口描述的更詳細(xì):


我就不翻譯了,太吃力了....%>_<%。在實(shí)現(xiàn)UncaughtExceptionHandler時,必須重載uncaughtException(Thread thread, Throwable ex) ,如果我們沒有實(shí)現(xiàn)該接口

也就是沒有顯示捕捉異常,則ex為空,否則ex不為空,thread 則為出異常的線程。

接下來上代碼,實(shí)現(xiàn)UncaughtExceptionHandler接口,顯示處理線程異常終止的情況:

  1. public class UnCeHandler implements UncaughtExceptionHandler {  
  2.       
  3.     private Thread.UncaughtExceptionHandler mDefaultHandler;    
  4.     public static final String TAG = "CatchExcep";  
  5.     CatchExcep application;  
  6.       
  7.     public UnCeHandler(CatchExcep application){  
  8.          //獲取系統(tǒng)默認(rèn)的UncaughtException處理器    
  9.          mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  
  10.          this.application = application;  
  11.     }  
  12.       
  13.     @Override  
  14.     public void uncaughtException(Thread thread, Throwable ex) {      
  15.         if(!handleException(ex) && mDefaultHandler != null){   
  16.             //如果用戶沒有處理則讓系統(tǒng)默認(rèn)的異常處理器來處理    
  17.             mDefaultHandler.uncaughtException(thread, ex);                
  18.         }else{         
  19.             try{    
  20.                 Thread.sleep(2000);    
  21.             }catch (InterruptedException e){    
  22.                 Log.e(TAG, "error : ", e);    
  23.             }     
  24.             Intent intent = new Intent(application.getApplicationContext(), MainActivity.class);  
  25.             PendingIntent restartIntent = PendingIntent.getActivity(    
  26.                     application.getApplicationContext(), 0, intent,    
  27.                     Intent.FLAG_ACTIVITY_NEW_TASK);                                                 
  28.             //退出程序                                          
  29.             AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);    
  30.             mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,    
  31.                     restartIntent); // 1秒鐘后重啟應(yīng)用   
  32.             application.finishActivity();  
  33.         }    
  34.     }  
  35.       
  36.     /**  
  37.      * 自定義錯誤處理,收集錯誤信息 發(fā)送錯誤報告等操作均在此完成.  
  38.      *   
  39.      * @param ex  
  40.      * @return true:如果處理了該異常信息;否則返回false.  
  41.      */    
  42.     private boolean handleException(Throwable ex) {    
  43.         if (ex == null) {    
  44.             return false;    
  45.         }    
  46.         //使用Toast來顯示異常信息    
  47.         new Thread(){    
  48.             @Override    
  49.             public void run() {    
  50.                 Looper.prepare();    
  51.                 Toast.makeText(application.getApplicationContext(), "很抱歉,程序出現(xiàn)異常,即將退出.",   
  52.                         Toast.LENGTH_SHORT).show();    
  53.                 Looper.loop();    
  54.             }   
  55.         }.start();    
  56.         return true;    
  57.     }    
  58. }  

通過在android Application 這個全局類中處理異常,如果不知道Application的作用請查看一下此鏈接:Application 詳解 

  1. public class CatchExcep extends Application{  
  2.       
  3.     ArrayList<Activity> list = new ArrayList<Activity>();  
  4.       
  5.     public void init(){  
  6.         //設(shè)置該CrashHandler為程序的默認(rèn)處理器    
  7.         UnCeHandler catchExcep = new UnCeHandler(this);  
  8.         Thread.setDefaultUncaughtExceptionHandler(catchExcep);   
  9.     }  
  10.       
  11.     /** 
  12.      * Activity關(guān)閉時,刪除Activity列表中的Activity對象*/  
  13.     public void removeActivity(Activity a){  
  14.         list.remove(a);  
  15.     }  
  16.       
  17.     /** 
  18.      * 向Activity列表中添加Activity對象*/  
  19.     public void addActivity(Activity a){  
  20.         list.add(a);  
  21.     }  
  22.       
  23.     /** 
  24.      * 關(guān)閉Activity列表中的所有Activity*/  
  25.     public void finishActivity(){  
  26.         for (Activity activity : list) {    
  27.             if (null != activity) {    
  28.                 activity.finish();    
  29.             }    
  30.         }  
  31.         //殺死該應(yīng)用進(jìn)程  
  32.        android.os.Process.killProcess(android.os.Process.myPid());    
  33.     }  
  34. }  

然后人為制造一個異常:

  1.     Button btn;  
  2.     TextView tv;  
  3.     private CatchExcep application;  
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.           
  9.         btn = (Button)findViewById(R.id.btn);  
  10.         tv = (TextView)findViewById(R.id.tv);  
  11.           
  12.         application = (CatchExcep)getApplication();  
  13.         application.init();  
  14.         application.addActivity(this);  
  15.           
  16.         btn.setOnClickListener(this);         
  17.     }     
  18.       
  19.     /** 
  20.      * 人為制造的異常*/  
  21.     public void press(){  
  22.         new Thread(new Runnable() {           
  23.             @Override  
  24.             public void run() {  
  25.                 tv.setText("dfsd");  
  26.             }  
  27.         }).start();  
  28.     }  
  29.     @Override  
  30.     public void onClick(View v) {  
  31.         press();  
  32.     }     
  33. }  

上訴代碼就能夠?qū)崿F(xiàn) 應(yīng)用出現(xiàn)無法捕捉的異常時,殺死當(dāng)前進(jìn)程,重新啟動一個應(yīng)用。


我之前困擾的地方:搜了很多資料,殺死異常進(jìn)程,重新啟動應(yīng)用,網(wǎng)上應(yīng)用都是通過Application對象調(diào)用startActivity(intent),然后殺死異常進(jìn)程。但是我怎樣試都不成功,

進(jìn)程是殺死了,但是應(yīng)用卻沒啟動起來,如果不將異常進(jìn)程殺死,那么關(guān)閉應(yīng)用時就得關(guān)閉兩次,顯然不能夠接受。網(wǎng)上的一些方法都是錯誤的:如下幾篇博客:

http://blog.csdn.net/xianming01/article/details/7711160

http://blog.csdn.net/ryantang03/article/details/9336295?reload

他們的方法能夠捕獲異常,殺死異常進(jìn)程,但是卻不能夠重新啟動應(yīng)用。

如何殺死異常進(jìn)程,重啟應(yīng)用,就得使用PendingIntent,這個類是android中對Intent類的包裝,具體了解我會在寫一篇博客,自己也可以去查看android API。

通過AlarmManager 啟動它,并且關(guān)閉打開的Activity殺死異常進(jìn)程就能夠?qū)崿F(xiàn)重新啟動應(yīng)用。

參考鏈接:

http://zheyiw./blog/1670990




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    男人和女人黄 色大片| 日韩特级黄片免费在线观看| 中文字幕亚洲人妻在线视频| 视频在线观看色一区二区| 日韩欧美国产三级在线观看| 日本不卡片一区二区三区| 亚洲妇女黄色三级视频| 老熟妇2久久国内精品| 国产目拍亚洲精品区一区| 中文久久乱码一区二区| av国产熟妇露脸在线观看| 日韩精品你懂的在线观看| 99视频精品免费视频| 日本一本在线免费福利| 日本黄色高清视频久久| 久久中文字幕中文字幕中文| 色一欲一性一乱—区二区三区| 国产一区二区三区草莓av| 亚洲精品国男人在线视频| 日韩综合国产欧美一区| 黄片美女在线免费观看| 久久精品亚洲情色欧美| 国产不卡的视频在线观看| 亚洲妇女作爱一区二区三区| 久七久精品视频黄色的| 婷婷激情四射在线观看视频| 国产情侣激情在线对白| 国产精品一区二区传媒蜜臀| 日韩一区二区三区四区乱码视频| 日本中文在线不卡视频| 成人精品视频一区二区在线观看| 色婷婷在线精品国自产拍| 国产精品亚洲综合色区韩国| 久久中文字幕中文字幕中文| 日本二区三区在线播放| 内用黄老外示儒术出处| 日本熟妇五十一区二区三区| 翘臀少妇成人一区二区| 欧美在线视频一区观看| 日本不卡一本二本三区| 青青操成人免费在线视频|