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)
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!");
}
}