fix(meeting): 解决会议房间学生端事件监听器内存泄漏问题
- 在离开房间时移除 socket 的 message 事件监听器 - 添加声网客户端事件监听器的清理逻辑 - 确保在房间切换和组件卸载时完全清理所有事件监听器 - 避免重复创建声网客户端实例时保留旧监听器 - 修复了可能造成内存泄漏的事件监听器残留问题
This commit is contained in:
@ -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);
|
||||||
|
|||||||
@ -213,7 +213,7 @@ export function useAgoraMeeting(
|
|||||||
if (client.value) {
|
if (client.value) {
|
||||||
client.value.removeAllListeners?.();
|
client.value.removeAllListeners?.();
|
||||||
}
|
}
|
||||||
|
|
||||||
client.value = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' });
|
client.value = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' });
|
||||||
if (tokenManagerRef.value) {
|
if (tokenManagerRef.value) {
|
||||||
tokenManagerRef.value.bindClient(client.value);
|
tokenManagerRef.value.bindClient(client.value);
|
||||||
@ -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(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user