android - fragment : No subscribers registered for event class 中的 GreenRobot EventBus 错误

标签 android android-fragments greenrobot-eventbus

我有一个 Activity ,它的布局包含一个 FrameLayout。我使用 framelayout 作为 fragment 容器。我使用 FragmentManager 事务替换了 FrameLayout 中的 fragment 。

在 fragment 的一种 onCreate 方法中,我使用 EventBus 注册 fragment 。

@Override
public void onCreate(){
  EventBus.getDefault().register(this);
  // other initialization code
}

fragment 在其布局中有一个 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());
        }
    });

此事件的事件处理程序方法在同一个 fragment 中,即该 fragment 具有以下方法

public void onEvent(MyEvent e){
    //some code;
}

在应用程序失去焦点并变为非 Activity 状态(由于按下主页按钮或屏幕锁定)之前,这一切正常。当我再次激活该应用程序时,不会调用事件的事件处理程序。我可以在 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:

当应用程序由于屏幕锁定或主页按钮被按下而变为非 Activity 状态时,将调用 fragment 的 onStop 方法。从 EventBus 注销 fragment 的代码在 onStop 方法中。当应用程序再次激活时,将调用 fragment 的 onStart 和 onResume 方法。所以我移动了我的代码以在其 onStart 方法中向 EventBus 注册该 fragment 。

@Override
public void onStart(){
  super.onStart();
  EventBus.getDefault().register(this);
}

我放置了一些日志语句来检查 onStart 方法是否在应用程序激活时实际被调用。它正在被调用。当应用程序变为非 Activity 状态然后再次 Activity 时,仍然无法正常工作。

编辑 2 我忘了提及包含此 fragment 的 Activity 也订阅了 EventBus。向 EventBus 注册 Activity 的代码在其 onCreate 方法中,注销 Activity 的代码在其 onStop 方法中。

最佳答案

包含此 fragment 的 Activity 也订阅了 EventBus。向 EventBus 注册 Activity 的代码在其 onCreate 方法中,注销 Activity 的代码在其 onStop 方法中。

当应用程序变得不活动时(由于屏幕锁定或按下主页按钮),包含 Activity 的 onStop 方法被调用并且它正在从 EventBus 中注销。出于某种原因,它包含的 fragment 也未注册(我不确定为什么)。向 EventBus 重新注册 fragment 无效。

我通过移动代码以取消注册包含 Activity 到它的 onDestroy 方法解决了这个问题。

我仍然不确定为什么这样做有效,但至少它解决了我当前的问题。如果有人有解释或更好的见解,请发表评论或发表答案。

关于android - fragment : No subscribers registered for event class 中的 GreenRobot EventBus 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26215831/

相关文章:

Android:设置媒体路由按钮时崩溃

android - 如何减小透明位图大小(不是尺寸)

java - 返回 map 时带有MapFragment黑屏的Android DrawerLayout

java - 如何在fragment Activity 下填充自定义 ListView (扩展Fragment)

android - 使用 fragment 管理器显示 fragment 时动画 Activity

java - EventBus 粘性事件是否在订阅者方法上自动删除?

android - 事件总线 fragment 注销

适用于 Android 的 PHP Google OAuth2 后端

java - 尝试修改 Activity 的后退按钮

java - 如何使用EventBus?