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:
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é 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 () ;.
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;
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))
// 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.
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.
Les abonnés peuvent choisir parmi quatre modes de fil: publication, principal, arrière-plan et asynchrone..
@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.
@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..
@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.
@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.
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 ());
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);
Dans ce tutoriel, vous avez appris sur:
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..