Android:即使我调用unregisterReceiver,仍会引发泄漏的IntentReceiver异常
我不明白为什么在按下后退按钮时会出现这种异常。我在onCreate方法中注册了IntentReceiver,应该在onPause方法中注销它。onPause方法内部的Log.w()调用使我相信正在调用unregisterReceiver()方法,但我仍然得到了这个异常 有什么想法吗Android:即使我调用unregisterReceiver,仍会引发泄漏的IntentReceiver异常,android,exception,Android,Exception,我不明白为什么在按下后退按钮时会出现这种异常。我在onCreate方法中注册了IntentReceiver,应该在onPause方法中注销它。onPause方法内部的Log.w()调用使我相信正在调用unregisterReceiver()方法,但我仍然得到了这个异常 有什么想法吗 private PlayerReceiver playerReceiver; public void onCreate(Bundle savedInstanceState) { ... IntentFi
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();
}
}
对数输出
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 org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 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.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was original
我在这里注册的。您是否缺少对unregisterReceiver()的调用?这是一个Android活动生命周期问题。我在一个主要活动中看到它,然后用返回到初始屏幕的后退按钮在设备上进行测试 在
onPause()方法中
注销在onCreate()中创建的BroadcastReceiver
在onRestart()
中重新注册一个全新的广播接收器
在activity类中,您需要将广播接收器的记录保存为实例数据成员
第二
我认为这也是Android的一个功能增强问题
有时开发人员需要一个广播接收器来延长活动的寿命。例如,了解某些屏幕状态何时可用。考虑工作流模型的对话上下文,它有许多状态
第三
您可以向活动注册和注销广播接收器,但在activity类中执行类似于isRegistered(BroadcastReceiver)
的简单调用可能非常有用
如果你需要接收者生活在活动之外,那么我不需要回答,除了通过在onDestroy()
调用中添加unregister(X)
来消除警告之外。YMMV;-) 我也有同样的问题。
原因是我无意中注册了同一个BroadcastReceiver两次。我的情况与Mullins相似,我在一个类及其子类中注册了一个receiver
对于像我这样的新手,只需在接收器上切换一个断点,然后调试应用程序。如果接收器类似于com.example.main.listener。MyRecevier@421c0100
,而logcat中的错误日志与之不同,例如com.example.main.listener。MyRecevier@4202fb40
,如果“@”后面的字符不同,您肯定注册了两次(或更多)
(上面是Mullins回答下的一条评论,事实上,我在这里发布它,因为我现在不能发布评论。)一般来说,你应该在onResume
中注册,在onPause
中注销(或者onStart
和onStop
)。因此,当活动恢复时,您可能多次取消注册而不重新注册。这似乎与您遇到的问题相反,但我猜它仍可能触发相同的日志警告?啊!谢谢克里斯托弗。我甚至没有注意到我正在onCreate
和onResume
中注册接收者这一事实。因此,我注册了两次,只注销了一次。啊!