Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:即使我调用unregisterReceiver,仍会引发泄漏的IntentReceiver异常_Android_Exception - Fatal编程技术网

Android:即使我调用unregisterReceiver,仍会引发泄漏的IntentReceiver异常

Android:即使我调用unregisterReceiver,仍会引发泄漏的IntentReceiver异常,android,exception,Android,Exception,我不明白为什么在按下后退按钮时会出现这种异常。我在onCreate方法中注册了IntentReceiver,应该在onPause方法中注销它。onPause方法内部的Log.w()调用使我相信正在调用unregisterReceiver()方法,但我仍然得到了这个异常 有什么想法吗 private PlayerReceiver playerReceiver; public void onCreate(Bundle savedInstanceState) { ... IntentFi

我不明白为什么在按下后退按钮时会出现这种异常。我在onCreate方法中注册了IntentReceiver,应该在onPause方法中注销它。onPause方法内部的Log.w()调用使我相信正在调用unregisterReceiver()方法,但我仍然得到了这个异常

有什么想法吗

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
中注册接收者这一事实。因此,我注册了两次,只注销了一次。啊!