web-dev-qa-db-ja.com

フラグメントのGreenRobot EventBusエラー:イベントクラスにサブスクライバーが登録されていません

私にはアクティビティがあり、そのレイアウトにはFrameLayoutが含まれています。 framelayoutをフラグメントコンテナーとして使用します。 FragmentManagerトランザクションを使用して、FrameLayoutのフラグメントを置き換えます。

フラグメントのonCreateメソッドの1つで、フラグメントを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メソッドにあります。

15
GunnerFan

このフラグメントを含むアクティビティは、EventBusにもサブスクライブしました。 EventBusにアクティビティを登録するコードはonCreateメソッドにあり、アクティビティの登録を解除するコードはonStopメソッドにありました。

アプリケーションが非アクティブになったとき(画面ロックまたはホームボタンを押したため)、含まれているアクティビティのonStopメソッドが呼び出され、EventBusから登録解除されていました。何らかの理由で、それを含むフラグメントも登録解除されました(理由はわかりません)。 EventBusを使用したフラグメントの再登録は機能しませんでした。

この問題を解決するには、コードを移動して、含まれているアクティビティをonDestroyメソッドに登録解除します。

なぜこれが機能するのかはまだわかりませんが、少なくとも現在の問題は解決します。誰かが説明やより良い洞察を持っている場合は、コメントするか、答えを投稿してください。

9
GunnerFan

私にとって問題は何か他のものだったので、まだコミットされていないフラグメントに投稿しようとしました。質問に記載されているのと同じ2つのエラーが表示されます。

そのため、投稿を呼び出す前にgetSupportFragmentManager().executePendingTransactions();を実行し、それによって問題が解決しました。

0
Edward van Raak