Tôi không hiểu tại sao tôi nhận được ngoại lệ này khi nhấn nút quay lại. Tôi đã đăng ký IntentReceiver trong phương thức onCreate và nó được cho là không được đăng ký trong phương thức onPause. Log.w() của tôi gọi bên trong của phương thức onPause dẫn tôi tin rằng phương thức unregisterReceiver() đang được gọi, nhưng tôi vẫn nhận được ngoại lệ này.Android: Rò rỉ IntentReceiver ngoại lệ đang được ném ngay cả khi tôi gọi unregisterReceiver
Mọi suy nghĩ?
private PlayerReceiver playerReceiver;
public void onCreate(Bundle savedInstanceState) {
...
IntentFilter playerFilter;
playerReceiver = new PlayerReceiver();
playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE);
playerFilter.addAction(PlayerService.BUFFERING_SUCCESS);
registerReceiver(playerReceiver, playerFilter);
...
}
protected void onPause() {
...
if (playerReceiver != null){
unregisterReceiver(playerReceiver);
Log.w(TAG, "playerReceiver has been unregistered");
playerReceiver = null;
}
...
}
public class PlayerReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){
setListenButton(false);
}
closePlayDialog();
}
}
LogCat Output
08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered
08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?
08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwo[email protected] that was original
ly đăng ký ở đây. Bạn có bỏ lỡ cuộc gọi đến unregisterReceiver() không?
Thông thường bạn nên đăng ký trong 'onResume' và hủy đăng ký trong' onPause' (hoặc 'onStart' và' onStop'). Vì vậy, có thể bạn không đăng ký nhiều lần mà không đăng ký lại khi hoạt động tiếp tục. Có vẻ như ngược lại với vấn đề bạn đang gặp phải, nhưng tôi đoán nó vẫn có thể kích hoạt cảnh báo nhật ký tương tự đó? –
Argh! Cảm ơn Christopher. Tôi thậm chí không chú ý đến thực tế là tôi đã đăng ký người nhận trong cả hai 'onCreate' và' onResume'. Vì vậy, thay vào đó, tôi đã đăng ký hai lần và chỉ hủy đăng ký một lần. Doh! –