Partager via


Xamarin.Forms MessagingCenter

Le modèle publier-s’abonner est un modèle de messagerie dans lequel les serveurs de publication envoient des messages sans avoir connaissance des destinataires, appelés des abonnés. De même, les abonnés écoutent des messages spécifiques, sans avoir connaissance des serveurs de publication.

Les événements dans .NET implémentent le modèle publication-abonnement et constituent l’approche la plus simple et la plus directe pour une couche de communication entre les composants si un couplage libre n’est pas nécessaire, tel qu’un contrôle et la page qui le contient. Toutefois, les durées de vie de l’auteur et de l’abonné sont couplées l’une à l’autre par des références d’objet, et le type d’abonné doit avoir une référence au type d’auteur. Cela peut créer des problèmes de gestion de la mémoire, en particulier lorsqu’il existe des objets de courte durée qui s’abonnent à un événement d’un objet statique ou de longue durée. Si le gestionnaire d’événements n’est pas supprimé, l’abonné est maintenu actif par la référence à celui-ci dans l’éditeur, ce qui empêche ou retarde le nettoyage de la mémoire de l’abonné.

La Xamarin.FormsMessagingCenter classe implémente le modèle publish-subscribe, autorisant la communication basée sur les messages entre les composants qui ne sont pas pratiques à lier par objet et références de type. Ce mécanisme permet aux serveurs de publication et aux abonnés de communiquer sans référence entre eux, ce qui contribue à réduire les dépendances entre eux.

La classe MessagingCenter fournit la fonctionnalité publier-s’abonner de multidiffusion. Cela signifie que plusieurs serveurs de publication peuvent publient un seul message, et que plusieurs abonnés peuvent écouter le même message :

Fonctionnalité publier-s’abonner de multidiffusion

Les serveurs de publication envoient des messages à l’aide de la méthode MessagingCenter.Send, alors que les abonnés écoutent les messages à l’aide de la méthode MessagingCenter.Subscribe. En outre, les abonnés peuvent également se désabonner des abonnements aux messages, si nécessaire, avec la méthode MessagingCenter.Unsubscribe.

Important

En interne, la classe MessagingCenter utilise des références faibles. Cela signifie qu’elle ne conserve pas les objets actifs et leur permet d’être récupérés de la mémoire. Par conséquent, il ne doit être nécessaire de se désabonner d’un message que lorsqu’une classe ne souhaite plus recevoir le message.

Publier un message

Les messages MessagingCenter sont des chaînes. Les serveurs de publication informent les abonnés d’un message avec l’une des surcharges MessagingCenter.Send. L’exemple de code suivant publie un message Hi :

MessagingCenter.Send<MainPage>(this, "Hi");

Dans cet exemple, la méthode Send spécifie un argument générique qui représente l’expéditeur. Pour recevoir le message, un abonné doit également spécifier le même argument générique, indiquant qu’il écoute un message de cet expéditeur. Cet exemple spécifie également deux arguments de méthode :

  • Le premier argument spécifie l’instance de l’expéditeur.
  • Le deuxième argument spécifie le message.

Les données de charge utile peuvent également être envoyées avec un message :

MessagingCenter.Send<MainPage, string>(this, "Hi", "John");

Dans cet exemple, la méthode Send spécifie deux arguments génériques. Le premier est le type qui envoie le message, tandis que le second est le type des données de charge utile envoyées. Pour recevoir le message, un abonné doit également spécifier les mêmes arguments génériques. Ainsi, plusieurs messages qui partagent une identité de message, mais qui envoient des types de données de charge utile différents, peuvent être reçus par différents abonnés. Cet exemple spécifie également un troisième argument de méthode qui représente les données de la charge utile à envoyer à l’abonné. Dans ce cas, les données de charge utile sont un string.

La méthode Send publie le message, ainsi que toutes les données de charge utile, à l’aide d’une approche « Fire and Forget ». Le message est donc envoyé, même si aucun abonné n’est inscrit pour recevoir le message. Dans ce cas, le message envoyé est ignoré.

S’abonner à un message

Les abonnés peuvent s’abonner pour recevoir un message à l’aide de l’une des surcharges MessagingCenter.Subscribe. L’exemple de code ci-dessous en est un exemple :

MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) =>
{
    // Do something whenever the "Hi" message is received
});

Dans cet exemple, la méthode Subscribe abonne l’objet this aux messages Hi envoyés par le type MainPage et exécute un délégué de rappel en réponse à la réception du message. Le délégué de rappel, spécifié sous forme d’expression lambda, peut être du code qui met à jour l’interface utilisateur, enregistre des données ou déclenche une autre opération.

Remarque

Un abonné n’a peut-être pas besoin de gérer chaque instance d’un message publié, ce qui peut être contrôlé par les arguments de type générique spécifiés sur la méthode Subscribe.

L’exemple suivant montre comment s’abonner à un message qui contient des données de charge utile :

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

Dans cet exemple, la méthode Subscribe abonne aux messages Hi envoyés par le type MainPage, dont les données de charge utile sont un string. Un délégué de rappel est exécuté en réponse à la réception d’un tel message, qui affiche les données de charge utile dans une alerte.

Important

Le délégué exécuté par la méthode Subscribe est exécuté sur le même thread que celui qui publie le message à l’aide de la méthode Send.

Se désabonner d’un message

Les abonnés peuvent se désinscrire des messages qu’ils ne souhaitent plus recevoir. Cela est possible avec l’une des surcharges MessagingCenter.Unsubscribe :

MessagingCenter.Unsubscribe<MainPage>(this, "Hi");

Dans cet exemple, la méthode Unsubscribe désabonne l’objet this du message Hi envoyé par le type MainPage.

Les messages contenant des données de charge utile doivent être désabonnés de l’utilisation de la surcharge Unsubscribe qui spécifie deux arguments génériques :

MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");

Dans cet exemple, la méthode Unsubscribe désabonne l’objet this du message Hi envoyé par le type MainPage, dont les données de charge utile sont un string.