diff --git a/lib/talk/startChart/handle/scp_message_base_handle.dart b/lib/talk/startChart/handle/scp_message_base_handle.dart index c825f972..430578bf 100644 --- a/lib/talk/startChart/handle/scp_message_base_handle.dart +++ b/lib/talk/startChart/handle/scp_message_base_handle.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:audioplayers/audioplayers.dart'; @@ -22,6 +23,8 @@ class ScpMessageBaseHandle { /// 分包缓冲区 // 存储每个 messageId 对应的分包数据 static Map>> _packetBuffer = {}; + final Map _packetTimers = {}; + final Duration _timeoutDuration = Duration(seconds: 10); // 分包组包最大超时时间 // 通话数据流的单例流数据处理类 final TalkDataRepository talkDataRepository = TalkDataRepository.instance; @@ -74,7 +77,7 @@ class ScpMessageBaseHandle { /// 处理分包逻辑 /// 如果没有收到所有包则返回null - dynamic handleFragmentedPayload({ + dynamic handleFragmentedPayload({ required int messageId, required int spTotal, required int spIndex, @@ -84,6 +87,7 @@ class ScpMessageBaseHandle { // 初始化分包列表 if (!_packetBuffer.containsKey(messageId)) { _packetBuffer[messageId] = List.filled(spTotal, []); + _startTimer(messageId); } // 检查分包索引是否在合法范围内 @@ -102,7 +106,7 @@ class ScpMessageBaseHandle { _packetBuffer[messageId]!.expand((packet) => packet).toList(); // 清除已重组的分包数据 - _packetBuffer.remove(messageId); + _clearPacketData(messageId); // 解析完整的 payload if (payloadType == PayloadTypeConstant.talkData) { @@ -120,4 +124,18 @@ class ScpMessageBaseHandle { return null; } } + + // 启动定时器 + void _startTimer(int messageId) { + _packetTimers[messageId]?.cancel(); + _packetTimers[messageId] = Timer(_timeoutDuration, () { + _clearPacketData(messageId); + }); + } + + // 清除分包数据和定时器 + void _clearPacketData(int messageId) { + _packetBuffer.remove(messageId); + _packetTimers.remove(messageId)?.cancel(); + } }