.NET MAUI实战 MessagingCenter
Net 实战 MAUI
2023-06-13 09:15:42 时间
1.概要
在.NET MAUI提供了消息机制,该机制为订阅/发布模式。发布-订阅模式是一种消息传递模式,在此模式下,发布者可在无需知道任何接收方(称为订阅方)的情况下发送消息。同样,订阅方可在不了解任何发布方的情况下侦听特定消息。
.NET 中的事件可实现发布-订阅模式,如果不需要松散耦合(例如控件和包含它的页面),则这些事件是通信层在组件之间最简单直接的方法。但是,发布服务器和订阅服务器的生存期通过对象引用彼此耦合,而订阅服务器类型必须引用发布服务器类型。这可能会造成内存管理问题,尤其是在订阅静态或长期对象事件的对象生存期较短时。如果不删除事件处理程序,则订阅服务器通过在发布服务器中引用它来保持活动状态,这将阻止或延迟订阅服务器的垃圾回收。
.NET 多平台应用 UI (.NET MAUI) MessagingCenter
类实现发布-订阅模式,允许在无法按对象和类型引用链接的组件之间实现基于消息的通信。这种机制允许发布方和订阅方在没有彼此引用的情况下进行通信,这有助于减少它们之间的依赖关系。
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)
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!");
}
}
相关文章
- .NET Core3.1 Dotnetty实战教程
- (03).NET MAUI实战 基础控件
- (04).NET MAUI实战 MVVM
- .NET MAUI实战 Routing
- .NET MAUI实战 FilePicker
- 开发积极探索Mysql.Net 开发之路(mysql.net)
- 应用使用Linux环境部署.Net应用程序(linux部署.net)
- NET与Oracle携手走向未来(.net 对oracle)
- NET 与 Oracle技术结合开启数据库新篇章(.net事物oracle)
- NET与Oracle结合出现新的可能(.net oracle)
- 数据库NET开发者操作Oracle数据库的全攻略(net操作oracle)
- NET与MySQL的无限结合(.net 连接mysql)
- NET操作MySQL数据库快速入门(.net读写mysql)
- Net环境下MySQL数据库驱动的研究与应用(.net的mysql驱动)
- NET技术结合MySQL实现数据库访问极致体验(.net数据库mysql)
- NET备份MySQL提升数据安全性(.net 备份mysql)
- ASP.NET入门随想之检票的老太太
- 关于.NET动态代理的介绍和应用简介
- Asp.net弹出对话框基类(输出alet警告框)
- asp.net下将图片保存到XML文件的方法
- ASP.NET中常用的用来输出JS脚本的类
- asp.net中获取新增加记录的IDAccess版
- asp.net服务器端指令include的使用及优势介绍
- Asp.net中DataTable导出到Excel的方法介绍
- 浅析.net策略模式