2014-10-06 64 views
15

我有一个活动,它的布局包含一个FrameLayout。我使用framelayout作为片段容器。我使用FragmentManager事务来替换FrameLayout中的片段。GreenRobot EventBus分段错误:未注册用户事件类

在其中一个片段的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()); 
     } 
    }); 

此事件的事件处理方法是在IE中的片段相同的片段有以下方法

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方法中。

+0

我的帖子中没有看到任何注册码。 – 2014-10-06 12:16:31

+1

它在onCreate方法中。在顶部:EventBus.getDefault()。register(this); – GunnerFan 2014-10-07 06:39:19

+0

@ S.D。检查我的编辑问题。 – GunnerFan 2014-10-07 07:35:26

回答

9

包含此片段的活动也订阅了EventBus。使用EventBus注册活动的代码位于其onCreate方法中,注销活动的代码位于其onStop方法中。

当应用程序变为非活动状态时(由于屏幕锁定或按Home按钮),包含活动的onStop方法被调用并且它正在从EventBus中取消注册。由于某种原因,其中包含的片段也未登记(我不知道为什么)。使用EventBus重新注册片段不起作用。

我通过移动代码来注销包含活动到其onDestroy方法来解决此问题。

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

+2

如果我理解正确,生命周期将不会再次调用onCreate,除非片段被破坏,这不一定会在每个时刻出现。所以onStop被调用,但除非onDestroy得到调用onCreate不会。我会期待onStart(不确定与片段),但不onCreate。 – Beggs 2014-12-05 04:52:39

0

对我来说,问题是别的,我试图做一个帖子到一个尚未提交的片段。您将收到与问题中所述相同的2个错误。

所以我在拨打帖子之前做了一个getSupportFragmentManager().executePendingTransactions();,并为我解决了问题。