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.
Dans le niveau inférieur de l’architecture de votre application, comme la base de données, lorsqu’une action se produit, vous souhaiterez peut-être envoyer des données à un niveau supérieur tel que la vue. Pour ce faire, vous souhaiterez peut-être créer une interface d’écoute, des tâches asynchrones ou des rappels. Tous ces éléments fonctionneront, mais ils présentent des inconvénients majeurs:
- accouplement direct ou serré
- enregistrement et désenregistrement de plusieurs dépendances individuellement
- répétition du code
- difficulté à tester
- risque accru de bugs
L’utilisation de l’architecture de publication / abonnement ou de bus de messages évite tous les problèmes potentiels mis en évidence ci-dessus. C’est un très bon moyen de mettre en œuvre des communications efficaces entre les composants d’une application sans qu’aucun d’eux n’ait besoin d’être immédiatement au courant des autres. En utilisant la publication / l’abonnement dans Android, tout composant d’application peut publier des événements qu’il transmettra au bus, et les consommateurs concernés peuvent 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 compile 'org.greenrobot:eventbus:3.0.0', puis synchronisez votre projet par la suite.
Un abonné à l’événement
Un abonné s’abonne simplement à un événement en s’inscrivant 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 d’événements avec register(). Cela informe le bus d’événements que vous souhaitez commencer à recevoir des événements. Dans une activité, c’est dans le onStart() méthode, tandis que dans un fragment, mettez-la dans le onAttact(Activity activity) méthode.
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
2. Désenregistrez l’abonné, ce qui signifie que le bus d’événements doit cesser de m’envoyer des événements. Dans une activité, c’est dans le onStop() méthode, tandis que dans un fragment, mettez-la dans le 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 l’action à entreprendre lorsque vous recevez l’événement. Remarquez le @Subscribe annotation en haut de cette méthode. Dans ce cas, nous voulons nous abonner à un événement normal et non à un événement permanent – j’expliquerai la différence plus tard.
@Subscribe
public void onEvent(MessageEvent event) {
Toast.makeText(this, "Hey, my message" + event.getMessage(), Toast.LENGTH_SHORT).show();.
}
Définition des messages d’événement
Les événements de 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 ou interface de base, ce sont simplement des POJO (Plain Old Java Objects).
public class MessageEvent {
public String mMessage;
public MessageEvent(String message) {
mMessage = message;
}
public String getMessage() {
return mMessage;
}
}
Post-événement et post-événement permanent
La principale différence entre un événement post-événement et un événement post permanent est le mécanisme de mise en cache utilisé à l’intérieur du bus d’événements. Quand quelqu’un publie un événement permanent, cet événement est stocké dans un cache. Lorsqu’une nouvelle activité ou un nouveau fragment s’abonne au bus d’événements, il obtient le dernier événement permanent du cache au lieu d’attendre qu’il soit à nouveau déclenché vers le bus d’événements. Cet événement reste donc dans le cache même après qu’un abonné l’ait obtenu.
Les événements persistants sont publiés avec le postSticky(MessageEvent) et les événements non collants avec la post(MessageEvent) méthode.
EventBus.getDefault().postSticky(new MessageEvent("Hey event subscriber!"));
EventBus.getDefault().post(new MessageEvent("Hey event subscriber!"));
Pour un événement régulier et non collant, si aucun abonné n’est trouvé, l’événement sera rejeté. Un événement permanent 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 pour une simple mise en cache des données, le suivi des niveaux de batterie, etc.
EventBus.getDefault().postSticky(new LocationReceivedEvent(6.4531, 3.3958))
Abonnez-vous à Post Sticky Event
// UI updates must run on MainThread
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {
textField.setText(event.getMessage());
}
Pour vous abonner à un événement permanent, vous incluez sticky = true à l’intérieur de @Subscribe annotation. Cela indique que nous voulons recevoir un événement permanent de type MessageEvent du cache.
Suppression des événements persistants
LocationReceivedEvent locationReceivedStickyEvent = EventBus.getDefault().getStickyEvent(LocationReceived.class);
if(stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(locationReceivedStickyEvent);
}
removeStickyEvent(Event) supprime un événement permanent du cache, et removeAllStickyEvents() supprimera tous les événements persistants.
Modes de thread EventBus
Les abonnés peuvent choisir entre quatre modes de thread: 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 de discussion que celui où l’événement est publié. Y compris ThreadMode.POSTING dans votre @Subscribe l’annotation est facultative.
Principale
@Subscribe(threadMode = ThreadMode.MAIN)
Dans ce mode de fil, les abonnés recevront des événements dans le fil de discussion principal de l’interface utilisateur, quel que soit l’endroit où l’événement a été publié. Il s’agit du mode de thread à utiliser si vous souhaitez mettre à jour des éléments d’interface utilisateur à la suite de l’événement.
Fond
@Subscribe(threadMode = ThreadMode.BACKGROUND)
Dans ce mode de discussion, les abonnés recevront les événements dans le même fil de discussion où ils sont publiés, tout comme pour ThreadMode.POSTING. La différence est que si l’événement est publié dans le fil principal, les abonnés les obtiendront à la place sur un fil d’arrière-plan. Cela garantit que la gestion des événements ne bloque pas l’interface utilisateur de l’application. Néanmoins, n’exécutez pas une opération qui prendra beaucoup de temps sur ce thread.
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 distinct. Ceci est utile pour les opérations de longue durée telles que les opérations 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’inscription. Les abonnés avec une priorité plus élevée obtiennent l’événement avant les abonnés avec une priorité inférieure. Cela affecte uniquement les abonnés dans le même mode de thread. Notez que la priorité par défaut est 0.
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
textField.setText(event.getMessage());
}
Annulation d’événements
Si vous souhaitez empêcher la diffusion d’un événement à d’autres abonnés, appelez le cancelEventDelivery(Object event) dans la méthode de gestion des événements de l’abonné.
@Subscribe
public void onEvent(MessageEvent event){
EventBus.getDefault().cancelEventDelivery(event);
}
Conclusion
Dans ce didacticiel, vous avez découvert:
- greenrobot EventBus et comment il peut améliorer votre application Android
- la différence entre les événements réguliers et persistants
- les différents modes de filetage disponibles et quand les utiliser
- priorités des abonnés
- annulation d’un événement pour ne plus recevoir d’événements
En apprendre davantage sur greenrobot EventBus, Je vous propose de visiter le documentation officielle.
Une autre bibliothèque que vous pouvez utiliser pour implémenter un bus d’événements est RxAndroid. Consultez notre article sur RxAndroid ici sur Envato Tuts +, ou essayez certains de nos autres cours ou tutoriels Android.
-
Premiers pas avec ReactiveX sur Android
-
Une introduction à Loopj
-
Android From Scratch: Comprendre les diffusions Android
-
Animez votre application Android
Soutenez notre effort ❤️
Si vous avez apprécié cet article, pensez à laisser un pourboire pour nous aider à continuer à publier du contenu de qualité.




















