GreenRobot EventBus erreur dans les fragments: Non abonnés inscrits à l'événement de classe
J'ai une activité, sa mise en page, contient un FrameLayout. J'utilise le framelayout comme un fragment de récipient. - Je remplacer les fragments de la FrameLayout à l'aide de FragmentManager transactions.
Dans l'un des fragment de la méthode onCreate-je enregistrer le fragment avec l'EventBus à l'aide.
@Override
public void onCreate(){
EventBus.getDefault().register(this);
//other initialization code
}
Le fragment a une GridView dans sa mise en page. Chaque fois qu'un élément dans le contrôle gridView est cliqué, je poste un événement à l'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());
}
});
Les méthodes de gestionnaire d'événement pour cet événement sont dans le même fragment, c'est à dire Le fragment a de la méthode suivante
public void onEvent(MyEvent e){
//some code;
}
Cela fonctionne bien jusqu'à ce que l'application perd le focus et devient inactif (en raison d'appuyer sur le bouton d'accueil ou de verrouillage de l'écran). Quand je fais de l'application active de nouveau, les gestionnaires d'événements pour les événements ne sont pas appelés. Je peux voir les instructions suivantes dans le 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
Quelqu'un peut me dire ce que je fais mal ici?
Edit 1:
Lorsque la demande devient inactif en raison de verrouillage de l'écran ou le bouton home enfoncé, le fragment de la méthode onStop est appelé. Le code pour annuler le fragment de l'EventBus est dans la méthode onStop. Lorsque l'application s'active à nouveau, le fragment de la onStart et onResume méthodes sont appelées. Donc je l'ai déplacé mon code pour inscrire le fragment avec l'EventBus dans sa méthode onStart.
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
J'ai mis un journal des états afin de vérifier si la méthode onStart est en fait appelée lorsque l'application active. Il est appelé. Des choses qui ne fonctionnent pas lors de l'application devient inactif, puis de nouveau actif.
Edit 2
J'ai oublié de mentionner que l'activité qui contient ce fragment a également souscrit à l'EventBus. Le code permettant d'enregistrer l'activité à l'EventBus est dans sa méthode onCreate et le code pour annuler l'enregistrement de l'activité réside dans sa méthode onStop.
- Je ne vois pas d'enregistrer le code dans votre post.
- Son dans la méthode onCreate. À droite en haut: EventBus.getDefault().s'inscrire(ce);
- Vérifier mon montage sur la question.
Vous devez vous connecter pour publier un commentaire.
L'activité qui contenait ce fragment a également souscrit à l'EventBus. Le code permettant d'enregistrer l'activité à l'EventBus était dans sa méthode onCreate et le code pour annuler l'inscription de l'activité dans sa méthode onStop.
Lorsque l'application était en train de devenir inactif (en raison de verrouillage de l'écran ou en appuyant sur le Bouton Home) le contenant de l'activité de la méthode onStop a été appelé et il était unregisterd de l'EventBus. Pour une raison que son contenant des fragments ont été également non (je ne sais pas pourquoi). Ré-enregistrant les fragments dans l'EventBus n'a pas de travail.
J'ai résolu ce problème en déplaçant le code pour annuler le contenant de son activité de méthode onDestroy.
Je ne suis toujours pas sûr de savoir pourquoi faire cela fonctionne, mais au moins elle n'en résout mon problème actuel. Si quelqu'un a une explication ou une meilleure idée de la commenter ou poster une réponse.
Pour moi le problème était autre chose, j'ai essayé de faire un post pour un fragment qui n'était pas encore engagée. Vous recevrez les mêmes 2 erreurs comme indiqué dans la question.
J'ai donc fait une
getSupportFragmentManager().executePendingTransactions();
avant d'appeler la poste et qui a résolu le problème pour moi.