.NET MAUI实战 MessagingCenter

1.概要

在.NET MAUI提供了消息机制,该机制为订阅/发布模式。发布-订阅模式是一种消息传递模式,在此模式下,发布者可在无需知道任何接收方(称为订阅方)的情况下发送消息。同样,订阅方可在不了解任何发布方的情况下侦听特定消息。.

.NET 中的事件可实现发布-订阅模式,如果不需要松散耦合(例如控件和包含它的页面),则这些事件是通信层在组件之间最简单直接的方法。但是,发布服务器和订阅服务器的生存期通过对象引用彼此耦合,而订阅服务器类型必须引用发布服务器类型。这可能会造成内存管理问题,尤其是在订阅静态或长期对象事件的对象生存期较短时。如果不删除事件处理程序,则订阅服务器通过在发布服务器中引用它来保持活动状态,这将阻止或延迟订阅服务器的垃圾回收。

.NET 多平台应用 UI (.NET MAUI) MessagingCenter 类实现发布-订阅模式,允许在无法按对象和类型引用链接的组件之间实现基于消息的通信。这种机制允许发布方和订阅方在没有彼此引用的情况下进行通信,这有助于减少它们之间的依赖关系。

MessagingCenter 类提供多播发布-订阅功能。这意味着可以有多个发布方发布单个消息,并且可能有多个订阅方正在侦听同一消息:

.NET MAUI实战 MessagingCenter

发布方使用 MessagingCenter.Send 方法发送消息,而订阅方使用 MessagingCenter.Subscribe 方法侦听消息。此外,订阅方还可以使用 MessagingCenter.Unsubscribe 方法取消消息订阅(如果需要)。

本期分享内容:

1.发布消息

2.订阅消息

3.取消订阅

2.详细内容

需要使用之前我们来看看,该对机制的定义方便我们了解并使用。

   public class MessagingCenter : IMessagingCenter
  {
       public MessagingCenter();
       public static IMessagingCenter Instance { get; }
       //发布消息
       public static void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class;
       public static void Send<TSender>(TSender sender, string message) where TSender : class;
       public static void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class;
       //订阅消息
       public static void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class;
       //取消订阅
       public static void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class;
       public static void Unsubscribe<TSender>(object subscriber, string message) where TSender : class;
  }

本次我们使用的方法为,Send、Subscribe、Unsubscribe,使用顺序为:

  • 1.先定义发送(Send)

  • 2.再定义接收订阅(Subscribe)

  • 3.最后离开当前页面或不再使用取消订阅(Unsubscribe)

.NET MAUI实战 MessagingCenter

public partial class MainPage : ContentPage
{
   private const string MessageChannel = "MY_CHANNEL";

   public MainPage()
{
InitializeComponent();
       Loaded += OnPageLoaded;
       Unloaded += OnPageUnloaded;
  }

   private void OnPageLoaded(object sender, EventArgs e)
  {
       //2.订阅消息
       MessagingCenter.Subscribe<MainPage, string>(this, MessageChannel, (sender, arg) =>
      {
           /*
           *1.如果不需要接收来自MainPage对象,可以将sender is MainPage 进行判断如果是MainPage发送的那么则不处理。
           * 因为发送消息的地方可以有多个,也有可能是NewPage1发送使用该通道发送消息。
           *2.arg就是返回给订阅方的消息内容“Hey juster!”
           */
           DisplayAlert("Message", arg, "ok");
      });
  }

   private void OnPageUnloaded(object sender, EventArgs e)
  {
       //3.取消订阅消息,如果不使用该消息频道一定需要释放,用时再重新创建订阅。它是强引用会一直占用资源存在MessagingCenter对象中。
       MessagingCenter.Unsubscribe<MainPage>(this,MessageChannel);
  }

   private void BtnPage2_Clicked(object sender, EventArgs e)
{
       /*
        * 1.发送消息
        * <MainPage,string>:MainPage是发送消息的对象,string 是约束需要发送参数的类型。
        * (this, MessageChannel,"Hey juster !") :this是发送方的对象引用,MessageChannel 可以理解为一个消息通道,只要订阅这个消息通道的地方都能收到这里发送的消息内容,"Hey juster !" 就是消息内容为string类型的消息。
        */
       MessagingCenter.Send<MainPage,string>(this, MessageChannel,"Hey juster!");
  }
}