fix(meeting): 解决会议房间学生端事件监听器内存泄漏问题

- 在离开房间时移除 socket 的 message 事件监听器
- 添加声网客户端事件监听器的清理逻辑
- 确保在房间切换和组件卸载时完全清理所有事件监听器
- 避免重复创建声网客户端实例时保留旧监听器
- 修复了可能造成内存泄漏的事件监听器残留问题
This commit is contained in:
2026-03-14 11:19:11 +08:00
parent 1c64968b5e
commit 726a8026be
2 changed files with 15 additions and 2 deletions

View File

@ -457,7 +457,14 @@
} }
isLeaving.value = true; isLeaving.value = true;
try { try {
// ✅ 移除所有事件监听器
socket.off('message', onSocketMessage); socket.off('message', onSocketMessage);
// ✅ 移除声网客户端的事件监听器
if (meeting.client.value) {
meeting.client.value.removeAllListeners?.();
}
try { try {
meetingSocket.leaveRoom(socket); meetingSocket.leaveRoom(socket);
} catch {} } catch {}
@ -663,7 +670,14 @@
if (isLeaving.value) { if (isLeaving.value) {
return; return;
} }
// ✅ 移除所有事件监听器
socket.off('message', onSocketMessage); socket.off('message', onSocketMessage);
// ✅ 移除声网客户端的事件监听器
if (meeting.client.value) {
meeting.client.value.removeAllListeners?.();
}
await cleanup(); await cleanup();
try { try {
meetingSocket.leaveRoom(socket); meetingSocket.leaveRoom(socket);

View File

@ -223,7 +223,6 @@ export function useAgoraMeeting(
* 播放远程视频到指定播放器 * 播放远程视频到指定播放器
* @deprecated 学生端使用 autoPlayRemoteVideo=false由业务层自行处理 * @deprecated 学生端使用 autoPlayRemoteVideo=false由业务层自行处理
*/ */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const playRemoteVideo = (user: IAgoraRTCRemoteUser, playerId: string) => { const playRemoteVideo = (user: IAgoraRTCRemoteUser, playerId: string) => {
console.log(`【声网】准备播放远程视频 ${playerId}:`, user.uid); console.log(`【声网】准备播放远程视频 ${playerId}:`, user.uid);
setTimeout(() => { setTimeout(() => {