使用Android BroadcastReceiver應該注意的一些問題

 

今天在 android 的 BroadcastReceiver 裏面寫一些代碼的時候出現了意想不到的異常。狀況是這樣的:java

當我在廣播類裏面這樣定義一個Dialog,而後再在這個類裏面調用dimiss方法時,對話框始終不消失,這讓我納悶了好久。。。android

 private ProgressDialog dialogDataUpload = null;
 private void dimiss() {
     if (dialogDataUpload != null) {
         dialogDataUpload.dismiss();
         dialogDataUpload = null;
     }
 }

後來仔細端詳這個類裏面的dimiss方法,發現 Eclipse有一個警告:「This Handler class should be static or leaks might occur」,這讓我隱約聯想到了之前看到的關於 BroadcastReceiver 的注意事項。後來經過詳細地瞭解 BroadcastReceiver,發現其生命週期只有十秒左右,若是在 onReceive() 內作超過十秒內的事情,就會報ANR(Application No Response) 程序無響應的錯誤信息,若是須要完成一項比較耗時的工做 , 應該經過發送 Intent 給 Service, 由Service 來完成 . 這裏不能使用子線程來解決 , 由於 BroadcastReceiver 的生命週期很短 , 子線程可能尚未結束BroadcastReceiver 就先結束了 .BroadcastReceiver 一旦結束 , 此時 BroadcastReceiver 的所在進程很容易在系統須要內存時被優先殺死 , 由於它屬於空進程 ( 沒有任何活動組件的進程 ). 若是它的宿主進程被殺死 , 那麼正在工做的子線程也會被殺死 . 因此採用子線程來解決是不可靠的。spa

經過這段解釋,讓我明白了出現的問題應該是因爲我執行了超過10秒的操做,因此在執行取消對話框的操做時廣播類的對象已銷燬,這樣 dimiss 方法確定不起做用了。因此,個人解決方法是在申明的 Dialog 前面加上 static 屬性,這樣當廣播的生命週期已結束時,因爲 static 的屬性,dimiss方法就會起做用了。固然最好的辦法是按照前面說的,若是是比較耗時的操做,最好啓動一個 Service 來處理。線程

相關文章
相關標籤/搜索