Dou*_*ler 14 android exception
我不明白为什么我在按下后退按钮时会遇到此异常.我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
LogCat输出
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
Run Code Online (Sandbox Code Playgroud)
在这里注册.你是否错过了对unregisterReceiver()的调用?
pet*_*rim 20
这是Android活动生命周期问题.我在一个主要活动中看到它,然后使用返回到启动画面的后退按钮在设备上进行测试.
在onPause()方法中.
取消注册BroadcastReceiver您在中创建的onCreate()
在onRestart()重新注册一个全新的广播接收器.
在活动类中,您需要将广播接收器的记录保存为实例数据成员.
第二
我认为这也是Android的功能增强问题.
有时,开发人员需要广播接收器才能比活动更长久.例如,了解某些屏幕状态何时可用.考虑工作流模型的对话上下文,其具有许多状态.
第三
您可以使用活动注册和取消注册广播接收器,但是像isRegistered(BroadcastReceiver)Activity类中的简单调用可能非常有用.
如果需要接收活过的活动,那么我不回答,只是沉默的警告,加入unregister(X)的onDestroy()呼叫.YMMV ;-)
| 归档时间: |
|
| 查看次数: |
36253 次 |
| 最近记录: |