J'ai une activité, sa mise en page contient un FrameLayout. J'utilise le framelayout comme un conteneur de fragments. Je remplace les fragments dans FrameLayout à l'aide de transactions FragmentManager.
Dans l'une des méthodes onCreate du fragment, j'enregistre le fragment avec EventBus à l'aide de.
@Override
public void onCreate(){
EventBus.getDefault().register(this);
// other initialization code
}
Le fragment a un GridView dans sa disposition. À chaque fois qu'un élément du gridView est cliqué, je publie un événement sur 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 du gestionnaire d’événements pour cet événement se trouvent dans le même fragment, c’est-à-dire que le fragment a la méthode suivante
public void onEvent(MyEvent e){
//some code;
}
Cela fonctionne correctement jusqu'à ce que l'application perde le focus et devienne inactive (en raison de l'appui sur le bouton d'accueil ou du verrouillage de l'écran). Lorsque je rends l'application active à nouveau, les gestionnaires d'événements pour les événements ne sont pas appelés. Je peux voir les déclarations 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-il me dire ce que je fais mal ici?
Modifier 1:
Lorsque l'application devient inactive en raison d'un verrouillage de l'écran ou de l'appui sur le bouton d'accueil, la méthode onStop du fragment est appelée. Le code pour désenregistrer le fragment de EventBus se trouve dans la méthode onStop. Lorsque l'application redevient active, les méthodes onStart et onResume du fragment sont appelées. J'ai donc déplacé mon code pour enregistrer le fragment avec EventBus dans sa méthode onStart.
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
Je mets quelques instructions de journal pour vérifier si la méthode onStart est réellement appelée lorsque l'application devient active. C'est être appelé. Les choses ne fonctionnent toujours pas lorsque l'application devient inactive, puis à nouveau active.
Edit 2 J'ai oublié de mentionner que l'activité qui contient ce fragment est également abonnée à EventBus. Le code pour enregistrer l'activité avec EventBus se trouve dans sa méthode onCreate et le code pour désenregistrer l'activité se trouve dans sa méthode onStop.
L'activité contenant ce fragment a également souscrit à EventBus. Le code pour enregistrer l'activité auprès de EventBus se trouvait dans sa méthode onCreate et le code pour annuler l'enregistrement de l'activité dans sa méthode onStop.
Lorsque l'application devenait inactive (en raison du verrouillage de l'écran ou de l'appui sur le bouton Accueil), la méthode onStop de l'activité qui la contenait était appelée et elle était en train d'être annulée auprès de EventBus. Pour une raison quelconque, ses fragments contenant ont également été non enregistrés (je ne sais pas pourquoi). Ré-enregistrer les fragments avec EventBus n'a pas fonctionné.
J'ai résolu ce problème en déplaçant le code pour annuler l'enregistrement de l'activité contenante dans sa méthode onDestroy.
Je ne sais toujours pas pourquoi cela fonctionne, mais au moins cela résout mon problème actuel. Si quelqu'un a une explication ou une meilleure idée, veuillez commenter ou poster une réponse.
Pour moi le problème était autre chose, j'ai essayé de faire un post sur un fragment qui n'était pas encore commis. Vous recevrez les mêmes 2 erreurs comme indiqué dans la question.
Alors j’ai fait un getSupportFragmentManager().executePendingTransactions();
avant d’appeler le poste et cela a réglé le problème pour moi.