我在构造函数中注册广播接收器时出错。但是,当我在onPause
中取消注册时,会抛出一个关于未注册的异常。这怎么可能,你可以帮我解决问题。
主要的问题是我被绑定到NetworkService
类,我也无法解除它。当我重新启动应用程序并说我有“泄漏”时,它会出现问题。但我不知道产生泄漏的两个问题中的哪一个。
这是我的代码:
常量
private static NetworkService networkService;
private ServiceConnection networkServiceConnection;
private BroadcastReceiver networkServiceMessageReceiver;
private boolean boundToService;
OnCreate中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
/** Defines callbacks for service binding, passed to bindService() */
networkServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
NetworkService.LocalBinder binder = (NetworkService.LocalBinder) service;
networkService = binder.getService();
boundToService = true;
LocalBroadcastManager.getInstance(SplashActivity.this).registerReceiver(networkServiceMessageReceiver, new IntentFilter(NetworkService.CHECK_FOR_UPDATE_RESULT));
checkForUpdate();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
boundToService = false;
}
};
}
的onResume
@Override
protected void onResume() {
super.onResume();
//Bind to NetworkService
if(!boundToService)
{
Intent intent = new Intent(this, NetworkService.class);
bindService(intent, networkServiceConnection, Context.BIND_AUTO_CREATE);
}
}
的onPause
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(networkServiceMessageReceiver);
}
调用OnStop
@Override
protected void onStop() {
super.onStop();
unbindService(networkServiceConnection);
}
答案 0 :(得分:1)
您在unregisterReceiver()
上下文中呼叫Activity
,但您在registerReceiver()
上下文中呼叫LocalBroadcastManager
。这不起作用。您需要在同一Context
上注册和注销。
请确保仅在Service
已被绑定时取消注册,否则您将无法调用register()
。
此外,由于您要在onPause()
取消注册,因此需要在onResume()
中重新注册。
答案 1 :(得分:0)
我在构造函数中注册广播接收器时出错。但是,当我在onPause中取消注册时,它会抛出一个异常,而不会被注册。
您正在服务连接中注册广播,具体取决于连接结果。绑定服务后,连接结果onServiceConnected
需要一些时间。同一时间如果调用onPause
,它会抛出一个关于未注册的异常。
简单的解决方案,只需为networkServiceMessageReceiver
添加空检查,如果它不为空,则只有在取消注册后才将其注销为null。