web-dev-qa-db-fra.com

Quelles sont les meilleures méthodes pour enregistrer/désenregistrer un bus d'événements?

Quel est le meilleur endroit pour vous inscrire et vous désinscrire à un bus d’événement (comme otto, EventBus ou tinybus) dans une activité et pourquoi?

  1. onCreate () - onDestroy ()
  2. onStart () - onStop ()
  3. onResume () - onPause ()

L'exemple d'Otto utilise onResume () - onPause (), les mentions d'EventBus onStart () - onStop (), et nous devions utiliser onCreate () - onDestroy () dans notre application pour mettre à jour l'interface utilisateur de l'activité, même si elle était en arrière-plan. Donc, je suppose que cela peut être n'importe lequel des trois en fonction de la nature des événements et de leur traitement, mais je me demandais s'il y avait autre chose à considérer.

23
levavare

@levavare, je pense que le bon moment pour vous inscrire/vous désinscrire dépend de vos événements et de ce que vous avez l'intention de faire avec eux. Et peut être différent pour différents événements au sein de la même application.

Par exemple, j'utilise EventBus dans une application Android qui surveille un périphérique d'enregistrement de données en temps réel (Arduino, par exemple) via Bluetooth. J'ai deux types d'événements assez différents. 

Mon code Bluetooth enregistre le premier événement pour signaler à l'un de mes fragments qu'un nouvel ensemble de lectures d'instrument a été reçu de l'appareil. Ce fragment les écrit ensuite dans une table de base de données. Il est important que cet événement soit toujours entendu et agi. Le fragment enregistre/désenregistre dans ses méthodes OnCreate/OnDestroy. Je souscris également à cet événement avec une priorité élevée.

L'autre événement est publié par la couche de base de données lorsque le nouvel enregistrement est ajouté à la base de données. J'ai une série de fragments qui montrent différents sous-ensembles de lectures (températures, pressions, conditions d'alarme). Lorsque l'un de ces fragments est visualisé, il doit être mis à jour dès que la nouvelle lecture est dans la base de données. Mais lorsque le fragment est à l'abri des regards, il n'y a aucune raison pour qu'il agisse sur une lecture. J'ai ces fragments register/unregister dans OnStart/OnStop. J'allais faire ce travail dans OnResume/OnPause et, franchement, je pense que cela fonctionnerait aussi bien pour mon application. Mais la réponse et le lien de @ Jordy m'ont convaincu de choisir OnStart/OnStop à la place.

8
Anne Gunn

Tout d’abord, ce n’est pas une question objective, c’est une question subjective;.

D'après mon expérience, Nous avons utilisé Otto dans l'un de nos projets. Nous avons suivi onResume () - onPause () qui nous a très bien servi. Cela a également du sens car nous devrions nous inscrire le plus tard possible et désenregistrer le plus rapidement possible tout en utilisant un bus d’événements.

13
Amit K. Saha

J'ai supprimé mon commentaire dans la réponse ci-dessus qu'il était préférable de s'inscrire/désinscrire dans onresume/onpause. J'ai eu un cas étrange d'utilisation où certains si mes événements n'allaient pas atteindre l'abonné annoté. Le meilleur moyen semble être d'utiliser onstart/onstop. Voici un bon SO post expliquant pourquoi:

https://stackoverflow.com/a/19737191/2361947

3
Jordy

Formulaire EventBus Documentation que j'ai trouvée et que ça marche pour moi: 

@Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

Et si vous devez envoyer la référence EventBus à l’enfant, alors:

private EventBus eventBus = EventBus.getDefault();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .......
}

@Override
public void onStart() {
    super.onStart();
    if(!eventBus.isRegistered(this)){
        eventBus.register(this);
    }else{
        Log.e(TAG, "EventBus is registered");
    }
}

@Override
public void onStop() {
    super.onStop();
    if(eventBus.isRegistered(this)){
       eventBus.unregister(this);
    }else{
       Log.e(TAG, "EventBus is not registered");
    }
}
0
Md Imran Choudhury