Communication au sein d'une application Android avec EventBus

Une application Android typique a tendance à être composée de nombreuses couches, modules ou structures tels que des fragments, des activités, des présentateurs et des services. Une communication efficace entre ces composants peut devenir difficile s’ils sont étroitement couplés. 

Au niveau inférieur de l'architecture de votre application, telle que la base de données, lorsqu'une action se produit, vous pouvez envoyer des données à un niveau supérieur, tel que la vue. Pour ce faire, vous pouvez créer une interface d’écoute, des tâches asynchrones ou des rappels. Tout cela fonctionnera, mais ils présentent des inconvénients majeurs:

  1. accouplement direct ou serré
  2. enregistrement et désinscription individuelle de plusieurs dépendances
  3. répétition du code
  4. difficulté à tester
  5. risque accru d'insectes

L'utilisation de l'architecture de publication / abonnement ou de bus de messages empêche tous les problèmes potentiels soulignés ci-dessus. C'est un très bon moyen d'implémenter des communications efficaces entre les composants d'une application sans qu'ils aient besoin d'être immédiatement au courant des autres. À l'aide de la fonction Publier / Souscrire dans Android, tout composant d'application peut publier des événements qu'il transfèrera au bus, et les consommateurs concernés pourront les consommer ou s'y abonner.. 

Pour utiliser greenrobot EventBus, vous devez d'abord l'ajouter à dans le module d'application. build.gradle fichier, inclure compiler 'org.greenrobot:eventbus: 3.0.0 ', puis synchronisez votre projet par la suite. 

Un abonné à un événement

Un abonné s'abonne simplement à un événement en s'enregistrant dans le bus d'événements et peut également désenregistrer cet événement. Pour être abonné, vous devez faire trois choses principales:

1. Enregistrez l'abonné dans le bus des événements avec registre(). Cela indique au bus d’événements que vous souhaitez commencer à recevoir des événements. Dans une activité, c'est dans le onStart () méthode, alors que dans un fragment mettre cela dans la onAttact (activité d'activité) méthode. 

@Override public void onStart () super.onStart (); EventBus.getDefault (). Register (this); 

2. Annulez l'inscription de l'abonné, ce qui signifie de dire au bus d'événements de cesser de m'envoyer des événements. Dans une activité, c'est dans le onStop () méthode, alors que dans un fragment mettre cela dans la onDetach () méthode. 

@Override public void onStop () super.onStop (); EventBus.getDefault (). Unregister (this); 

3. Mettre en œuvre le onEvent () pour indiquer le type d’événement que vous souhaitez recevoir et les mesures à prendre lorsque vous le recevez. Remarquez le @Souscrire annotation en haut de cette méthode. Dans ce cas, nous voulons souscrire à un événement normal et non collant. J'expliquerai la différence plus tard..

@Subscribe public void onEvent (événement MessageEvent) Toast.makeText (this, "Hey, mon message" + event.getMessage (), Toast.LENGTH_SHORT) .show () ;. 

Définir des messages d'événement

Les événements dans greenrobot EventBus ne sont que des objets que vous définissez. Vous pouvez avoir différentes classes d'événements si vous le souhaitez. Ils n'héritent d'aucune classe de base ou interface, mais simplement de POJO (Plain Old Java Objects). 

Classe publique MessageEvent public String mMessage; public MessageEvent (message de chaîne) mMessage = message;  public String getMessage () return mMessage; 

Post Event et Post Sticky Event

La principale différence entre post event et post sticky est le mécanisme de mise en cache utilisé dans le bus d'événements. Lorsqu'une personne publie un événement collant, cet événement est stocké dans une mémoire cache. Lorsqu'une nouvelle activité ou un nouveau fragment s'abonne au bus d'événements, il récupère le dernier événement collant dans le cache au lieu d'attendre qu'il soit renvoyé au bus d'événements. Cet événement reste donc dans le cache même après qu'un abonné l'ait reçu.. 

Les événements collants sont affichés avec le postSticky (MessageEvent) méthode, et des événements non collants avec le post (MessageEvent) méthode.

EventBus.getDefault (). PostSticky (nouveau MessageEvent ("Hey event subscriber!")); EventBus.getDefault (). Post (new MessageEvent ("Hey event subscriber!"));

Pour un événement régulier non collant, si aucun abonné n'est trouvé, l'événement sera jeté. Un événement collant sera mis en cache, cependant, au cas où un abonné viendrait plus tard.

Alors, quand décidez-vous d'utiliser l'événement post-collant? Vous pouvez le faire si vous recherchez l'emplacement de l'utilisateur ou si vous souhaitez simplement mettre en cache des données, suivre les niveaux de batterie, etc.. 

EventBus.getDefault (). PostSticky (new LocationReceivedEvent (6.4531, 3.3958))

Abonnez-vous à Post Sticky Event

// Les mises à jour de l'interface utilisateur doivent être exécutées sur MainThread @Subscribe (sticky = true, threadMode = ThreadMode.MAIN) public void onEvent (événement MessageEvent) textField.setText (event.getMessage ()); 

Pour vous abonner à un événement collant, vous incluez collant = vraià l'intérieur de @Souscrire annotation. Cela indique que nous souhaitons recevoir un événement collant de type MessageEvent de la cache. 

Supprimer les événements collants

LocationReceivedEvent locationReceivedStickyEvent = EventBus.getDefault (). GetStickyEvent (LocationReceived.class); if (stickyEvent! = null) EventBus.getDefault (). removeStickyEvent (locationReceivedStickyEvent); 

removeStickyEvent (événement) supprime un événement collant de la mémoire cache, et removeAllStickyEvents () va supprimer tous les événements collants. 

Modes de threads EventBus

Les abonnés peuvent choisir parmi quatre modes de fil: publication, principal, arrière-plan et asynchrone..

Affectation

@Subscribe (threadMode = ThreadMode.POSTING)

C'est la valeur par défaut. Les abonnés seront appelés dans le même fil que celui où l'événement est publié. Comprenant ThreadMode.POSTING dans ton @Souscrire l'annotation est facultative. 

Principale 

@Subscribe (threadMode = ThreadMode.MAIN)

Dans ce mode de fil, les abonnés recevront des événements dans le fil principal de l'interface utilisateur, quel que soit le lieu où l'événement a été publié. C'est le mode de thread à utiliser si vous souhaitez mettre à jour des éléments d'interface utilisateur à la suite de l'événement..

Contexte

@Subscribe (threadMode = ThreadMode.BACKGROUND)

Dans ce mode de fil, les abonnés recevront des événements dans le même fil où ils sont publiés, comme pour ThreadMode.POSTING. La différence est que si l'événement est publié dans le fil principal, les abonnés les obtiendront plutôt sur un fil d'arrière-plan. Cela garantit que la gestion des événements ne bloque pas l'interface utilisateur de l'application. Cependant, ne lancez pas une opération qui prendra beaucoup de temps sur ce fil. 

Async

@Subscribe (threadMode = ThreadMode.ASYNC)

Dans ce mode de thread, les abonnés recevront toujours des événements indépendamment du thread actuel et du thread principal. Cela permet aux abonnés de s'exécuter sur un thread séparé. Ceci est utile pour les opérations de longue durée telles que les opérations de réseau. 

Priorités des abonnés 

Si vous souhaitez modifier l'ordre dans lequel les abonnés reçoivent les événements, vous devez spécifier leurs niveaux de priorité lors de l'enregistrement. Les abonnés dont la priorité est supérieure obtiennent l'événement avant les abonnés dont la priorité est inférieure. Cela n'affecte que les abonnés du même mode de thread. Notez que la priorité par défaut est 0. 

@Subscribe (priorité = 1); public void onEvent (événement MessageEvent) textField.setText (event.getMessage ()); 

Annulation d'événements

Si vous souhaitez empêcher qu'un événement soit transmis à d'autres abonnés, appelez le cancelEventDelivery (événement Object) méthode à l'intérieur de la méthode de gestion des événements de l'abonné. 

@Subscribe public void onEvent (événement MessageEvent) EventBus.getDefault (). CancelEventDelivery (event); 

Conclusion

Dans ce tutoriel, vous avez appris sur:

  • greenrobot EventBus et comment il peut améliorer votre application Android
  • la différence entre les événements réguliers et collants
  • les différents modes de thread disponibles et quand utiliser chacun d'eux
  • priorités des abonnés
  • annuler un événement pour ne plus recevoir d'événements

Pour en savoir plus sur greenrobot EventBus, je vous suggère de consulter la documentation officielle..

RxAndroid est une autre bibliothèque que vous pouvez utiliser pour implémenter un bus d’événements. Consultez notre article sur RxAndroid ici sur Envato Tuts +, ou essayez quelques-uns de nos autres cours ou tutoriels Android..

  • Débuter avec ReactiveX sur Android

    La base de code des applications complexes avec de nombreuses connexions réseau et interactions utilisateur est souvent encombrée de rappels. Un tel code est non seulement long et difficile à…
    Ashraff Hathibelagal
    Android
  • Une introduction à Loopj

    Dans ce didacticiel, vous apprendrez à utiliser Loopj, une bibliothèque conviviale pour les requêtes HTTP dans Android. Pour vous aider à apprendre, nous allons utiliser Loopj pour créer…
    Pedro Gonzalez Ferrandez
    Studio Android
  • Android From Scratch: Comprendre les émissions Android

    Dans ce didacticiel, vous apprendrez à créer, envoyer et recevoir des émissions locales et à l’échelle du système. Vous apprendrez également à utiliser un tiers populaire…
    Ashraff Hathibelagal
    SDK Android
  • Animez votre application Android

    Les animations sont devenues une partie importante de l'expérience utilisateur Android. Une animation subtile et bien conçue est utilisée dans tout le système d'exploitation Android et peut…
    Ashraff Hathibelagal
    Développement mobile