У меня есть активность, назовем ее A
, которая запускается внутри фрагментов b
и c
. во фрагменте c
у меня есть BroadcastReceiver, который я инициирую в отклонении класса следующим образом:
private final BroadcastReceiver mConnectionChangeReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (System.currentTimeMillis() - CustomizedDeviceListFragment.this.mStartTime > 200L) {
CustomizedDeviceListFragment.this.updateErrorStates();
}
}
};
, затем я регистрирую его в резюме:
public void onResume() {
super.onResume();
this.mStartTime = System.currentTimeMillis();
this.getActivity().registerReceiver(this.mConnectionChangeReceiver, filter);
}
и отменяю регистрацию на паузе:
public void onPause() {
this.getActivity().unregisterReceiver(this.mConnectionChangeReceiver);
super.onPause();
}
все это делается во фрагменте c
. теперь я иногда получаю сообщение об ошибке при активности A
. это ошибка:
E/ActivityThread: Activity A has leaked IntentReceiver packageName.TcpClient$3@6ef2912 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity A has leaked IntentReceiver packageName.TcpClient$3@6ef2912 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1707)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:1438)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1577)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1550)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1538)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:641)
at packageName.TcpClient$2.run(TcpClient.java:289)
at java.lang.Thread.run(Thread.java:919)
почему возникает эта ошибка и как ее предотвратить?