我有一个带有ListView和一个BroadcastReceiver的Fragment,它会在新数据到达时更新ListView。 Fragments生命由ViewPager控制。
关于在哪里(联合国)注册BroadcastReceiver,我发现several places建议在
中执行此操作 onResume()
:
refreshReceiver = new RefreshReceiver();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
refreshReceiver,
refreshIntentFilter);
onPause()
:
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(refreshReceiver);
但是,这不能正常工作。当我长按主页按钮进入最近的应用程序屏幕时,会调用onPause()
。当我在最近的应用上时出现新信息时,ListView错过了更新并在我返回后显示旧信息。
现在我正考虑将取消注册移动到onStop()
方法(甚至在onDestroy()
中),但是当片段被销毁时,是否可以保证调用?我很担心,因为如果BroadcastManager持有对BroadcastReceiver的引用,并且反过来持有对Fragment的引用,那将是一个非常严重的内存泄漏。
答案 0 :(得分:0)
如果您不需要接收器,请取消注册。如果您只在该片段中使用它,您可以考虑在ViewDestroyed()上取消注册它。
答案 1 :(得分:0)
根据this answer,如果您的片段是单个而不是寻呼机,您可以取消/注册LBM:
Content-Length: 0
否则,您需要找出@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
broadcast_manager, new IntentFilter("filter"));
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcast_manager);
}
何时可见,然后注册LBM。
通过这个:
fragment
您可以在片段
中注册LBM