我有一个活动,它的布局包含一个 FrameLayout。我使用框架布局作为片段容器。我使用 FragmentManager 事务替换 FrameLayout 中的片段。
在片段的 onCreate 方法之一中,我使用 EventBus 注册片段。
@Override
public void onCreate(){
EventBus.getDefault().register(this);
// other initialization code
}
该片段的布局中有一个 GridView。每当单击 gridView 中的项目时,我都会将事件发布到 EventBus
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.fragment_category, container, false);
gridView = (GridView) rootView.findViewById(R.id.categry_grid_view);
gridAdapter = new CustomGridAdapter(getActivity());
gridView.setAdapter(gridAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Category clickedCategory = gridAdapter.getItem(position);
EventBus.getDefault().post(new MyEvent());
}
});
此事件的事件处理程序方法在同一个片段中,即片段具有以下方法
public void onEvent(MyEvent e){
//some code;
}
这工作正常,直到应用程序失去焦点并变为非活动状态(由于按下主页按钮或屏幕锁定)。当我再次激活应用程序时,不会调用事件的事件处理程序。我可以在 LogCat 中看到以下语句
com.example.app D/Event﹕ No subscribers registered for event class com.example.app.MyEvent
com.example.app D/Event﹕ No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent
有人可以告诉我我在这里做错了什么吗?
编辑1:
当应用程序由于屏幕锁定或按下主页按钮而变为非活动状态时,将调用片段的 onStop 方法。从 EventBus 中注销片段的代码在 onStop 方法中。当应用程序再次激活时,将调用片段的 onStart 和 onResume 方法。所以我移动了我的代码,在其 onStart 方法中使用 EventBus 注册片段。
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
我放了一些日志语句来检查应用程序激活时是否实际调用了 onStart 方法。它正在被调用。当应用程序变为非活动状态然后再次活动时,仍然无法正常工作。
编辑 2 我忘了提到包含这个片段的活动也订阅了 EventBus。向 EventBus 注册活动的代码在其 onCreate 方法中,取消注册活动的代码在其 onStop 方法中。