has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregister,intentreceiver
今天碰到了這個錯誤:has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregisterReceiver
:
這個錯誤的中文意思是,已經溢出了IntentReceiver,你是忘記了調用登出廣播的方法嗎?
原因所在:
之所以是溢出IntentReceiver,原因是有receiver 被register後沒有被unregister,反覆幾次後造成 intentReceiver 泄漏
但我其實是有調用unregisterReceiver(batteryReceiver),那為什麼還會出現這個問題
解決方案:
為了避免這個問題的出現,註冊廣播和登出廣播要成對出現,但同時又為了避免null 指標的問題,我們最好加一個標誌位flag
/** * 標誌位,是否broadcaseReceiver開啟,預設為false */boolean flag=false;
在註冊廣播的時候,將flag變為true
/** * 註冊廣播 */private void registerReceiver() {flag=true;IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_BATTERY_CHANGED);batteryReceiver=new BatteryReceiver();registerReceiver(batteryReceiver, filter);}
在登出廣播的之前,先判斷flag是否為真,(即是否廣播已經被註冊了),如果為真,則登出廣播
@Overridepublic void onPause() {if(flag){flag=false;unregisterReceiver(batteryReceiver);}super.onPause();}
之所以加flag,就是避免沒有註冊廣播,但卻登出廣播,這樣會有null 指標
轉載請註明出處,謝謝http://blog.csdn.net/harryweasley/article/details/45092041