.NET MAUI实战 MessagingCenter

2022-12-07 20:46:58 浏览数 (1)

1.概要

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

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

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

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

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

本期分享内容:

1.发布消息

2.订阅消息

3.取消订阅

2.详细内容

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

代码语言:javascript复制
    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)
代码语言:javascript复制
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!");
    }
}

0 人点赞