diff --git a/app/src/main/java/com/shuwei/dish/match/scale/ScaleServiceManager.kt b/app/src/main/java/com/shuwei/dish/match/scale/ScaleServiceManager.kt index 6eb65fe..9d65b23 100644 --- a/app/src/main/java/com/shuwei/dish/match/scale/ScaleServiceManager.kt +++ b/app/src/main/java/com/shuwei/dish/match/scale/ScaleServiceManager.kt @@ -111,16 +111,16 @@ object ScaleServiceManager { client.connect(remoteId, host, port) } - // mDNS 发现:发现子设备 → 建立 WebSocket 连接;设备离线 → 断开连接并清除数据 + // mDNS 发现:发现子设备 → 建立 WebSocket 连接;设备离线 → 仅清除 UDP 缓存,WebSocket 层自行重连 mdnsDiscovery = MdnsDiscoveryManager(context).also { discovery -> discovery.onDeviceFound = { remoteId, host, port -> onDeviceFound(remoteId, host, port) } discovery.onDeviceLost = { remoteId -> - Log.d(TAG, "子设备离线 $remoteId, 断开连接并清除数据") - client.disconnect(remoteId) - aggregator?.removeDevice(remoteId) + // mDNS 抖动不永久断开,WebSocket 层会持续重连直到网络恢复 + // 仅清除 UDP 缓存,确保 UDP 重新发现时能再次触发 onDeviceFound udpReceiver?.removeDevice(remoteId) + Log.d(TAG, "子设备 mDNS 离线: $remoteId, 保持 WebSocket 重连") } discovery.startDiscovery() } diff --git a/app/src/main/java/com/shuwei/dish/match/scale/ScaleWebSocketClient.kt b/app/src/main/java/com/shuwei/dish/match/scale/ScaleWebSocketClient.kt index 89eed4a..109f185 100644 --- a/app/src/main/java/com/shuwei/dish/match/scale/ScaleWebSocketClient.kt +++ b/app/src/main/java/com/shuwei/dish/match/scale/ScaleWebSocketClient.kt @@ -100,10 +100,10 @@ class ScaleWebSocketClient { /** * 指数退避重连 + * 入口不拦截 removedDevices,仅在延迟任务执行前检查, + * 确保 disconnect() 后已入队的任务不执行,但新断线事件始终能进入重连流程 */ private fun scheduleReconnect(deviceId: String, host: String, port: Int) { - if (removedDevices.contains(deviceId)) return - val delay = reconnectDelays[deviceId] ?: RECONNECT_BASE_MS Log.d(TAG, "将在 ${delay}ms 后重连子设备: $deviceId")