2014-10-06 28 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();,併爲我解決了問題。