2024/11/06 15:20:23
添加事件监听
如需收到消息和事件通知,你需要先实现事件监听程序,然后订阅或者加入你想要接收消息或事件通知的频道。
添加事件监听
RTM 采用统一入口的方式处理消息和事件通知,每一种消息和事件通知都有对应的事件处理程序入口,你可以在其中实现自己的业务处理逻辑:
C#
// add message event listener
rtmClient.OnMessageEvent += newMessageEvent =>
{
var channelName = newMessageEvent.channelName;
var channelType = newMessageEvent.channelType;
var topic = newMessageEvent.channelTopic;
var publisher = newMessageEvent.publisher;
var messageType = newMessageEvent.messageType;
var message = newMessageEvent.message;
var customType = newMessageEvent.customType;
// your Logic
};
// add presence event listener
rtmClient.OnPresenceEvent += newPresenceEvent =>
{
var channelName = newPresenceEvent.channelName;
var channelType = newPresenceEvent.channelType;
var eventType = newPresenceEvent.type;
var publisher = newPresenceEvent.publiser;
var stateItems = newPresenceEvent.stateItems;
var interval = newPresenceEvent.interval;
var snapshot = newPresenceEvent.snapshot;
// your Logic
};
// add topic event listener
rtmClient.OnTopicEvent += newTopicEvent =>
{
var channelName = newTopicEvent.channelName;
var eventType = newTopicEvent.type;
var publisher = newTopicEvent.publisher;
var topicInfos = newTopicEvent.topicInfos;
if (topicInfos != null)
{
// your logic
}
};
// add storage event listener
rtmClient.OnStorageEvent += newStorageEvent =>
{
var channelName = newStorageEvent.channelName;
var channelType = newStorageEvent.channelType;
var eventType = newStorageEvent.eventType;
var category = newStorageEvent.target;
var data = newStorageEvent.data;
if (data != null)
{
// your logic
}
};
// add lock event listener
rtmClient.OnLockEvent += newLockEvent =>
{
var channelName = newLockEvent.channelName;
var channelType = newLockEvent.channelType;
var eventType = newLockEvent.eventType;
var LockDetail = newLockEvent.lockDetailList;
if( LockDetail != null )
{
// your logic
}
};
// add OnConnectionStateChange event listener
rtmClient.OnConnectionStateChanged +=(channelName, state, reason ) =>
{
Debug.Log(string.Format("OnConnectionStateChanged channelName {0}: state:{1} reason:{2}", channelName, state, reason);
// your logic
};
// add OnTokenPrivilegeWillExpire event listener
rtmClient.OnTokenPrivilegeWillExpire += channelName =>
{
Debug.Log(string.Format("OnTokenPrivilegeWillExpire channelName {0}", channelName));
// your logic
};
删除事件监听
为避免内存泄漏、错误和异常(即空指针异常)引起的性能下降,声网建议你在不需要使用某个事件处理程序时对其进行注销。如需注销事件监听程序,则需在添加事件监听时避免采用匿名函数的方式,以下是添加和注销事件监听程序的示例代码。
C#
private void AddEventsListener()
{
rtmClient.OnMessageEvent += OnMessageEvent;
rtmClient.OnPresenceEvent += OnPresenceEvent;
rtmClient.OnTopicEvent += OnTopicEvent;
rtmClient.OnStorageEvent += OnStorageEvent;
rtmClient.OnLockEvent += OnLockEvent;
rtmClient.OnConnectionStateChanged += OnConnectionStateChanged;
rtmClient.OnTokenPrivilegeWillExpire += OnTokenPrivilegeWillExpire;
}
private void RemoveEventsListener()
{
rtmClient.OnMessageEvent -= OnMessageEvent;
rtmClient.OnPresenceEvent -= OnPresenceEvent;
rtmClient.OnTopicEvent -= OnTopicEvent;
rtmClient.OnStorageEvent -= OnStorageEvent;
rtmClient.OnLockEvent -= OnLockEvent;
rtmClient.OnConnectionStateChanged -= OnConnectionStateChanged;
rtmClient.OnTokenPrivilegeWillExpire -= OnTokenPrivilegeWillExpire;
}
private void OnMessageEvent( MessageEvent Event) { }
private void OnPresenceEvent( PresenceEvent Event) { }
private void OnTopicEvent( TopicEvent Event) { }
事件通知类型
RTM 一共有 7 种类型事件,对应的有 7 种事件监听程序。你可以查看 API 参考的事件监听章节,了解每个事件监听程序传入参数的详细信息。
事件监听程序 | 描述 |
---|---|
OnMessageEvent | 接收所有订阅的 Message Channel 中的消息通知或你加入的所有 Stream Channel 中订阅的 Topic 消息通知。事件负载数据中包含频道名称、频道类型、Topic 名称、事件发送者、消息负载数据类型等信息。 |
OnPresenceEvent | 接收所有订阅的 Message Channel 或者你加入的所有 Stream Channel 中远端用户的在线状态事件通知。事件负载数据中包含频道名称、频道类型、事件类型、事件发送者、用户临时状态数据等信息。 |
OnTopicEvent | 接收加入的所有 Stream Channel 中 Topic 变更事件通知。事件负载数据中包含频道名称、事件类型、Topic 名称、事件发送者(即 Topic 详情)等信息。 |
OnStorageEvent | 接收订阅的 Message Channel 及加入的 Stream Channel 中所有的 Channel Metadata 事件通知,以及所有订阅用户的 User Metadata 事件通知。事件负载数据中包含频道名称、频道类型、事件类型(即具体 Metadata 数据)等信息。 |
OnLockEvent | 接收订阅的 Message Channel 及加入的 Stream Channel 中所有的 Lock 事件通知。事件负载数据中包含有频道名称、频道类型、事件类型、锁详情等信息。 |
OnConnectionStateChanged | 接收客户端网络连接状态变更的事件通知,包含频道名称、连接状态以及变更原因等信息。 |
OnTokenPrivilegeWillExpire | 接收客户端 Token 将要过期的事件通知。 |
完成事件监听处理程序后,你可以通过订阅频道或 Topic 来接收指定的 Message Channel 或 Stream Channel 中的消息和事件通知了。详见订阅 Message Channel 和订阅 Topic。