fix: Socket.IO连接超时和日志刷屏修复

- NetworkManager重写为两阶段连接策略:Phase1快速10秒轮询 + Phase2后台监控(最长2分钟)
- Phase2与Socket.IO内置重连机制协作而非对抗,超时后触发forceReconnect
- 所有魔法数字提取为companion object常量
- ScreenCaptureManager: Socket.IO不可用日志降频(首次+每50次打印)
- 连接恢复时打印跳过帧数统计
- MainActivity: 清理残留emoji符号
This commit is contained in:
wdvipa
2026-02-15 18:17:13 +08:00
parent aa516590c8
commit 5b2ddd7730
3 changed files with 176 additions and 464 deletions

View File

@@ -1847,30 +1847,44 @@ class ScreenCaptureManager(private val service: AccessibilityRemoteService) {
}
}
// Socket unavailable log throttle counter
private var socketUnavailableLogCount = 0
/**
* 处理单帧数据
* Process single frame data.
* Throttles "socket unavailable" log to avoid flooding logcat
* when connection is down but capture is still running.
*/
private suspend fun processFrameData(frameData: ByteArray) {
try {
var success = false
// 优先使用Socket.IO v4官方客户端发送屏幕数据
val socketIOManager = service.getSocketIOManager()
if (socketIOManager != null && socketIOManager.isConnected()) {
socketIOManager.sendScreenData(frameData)
Log.v(TAG, "Socket.IO v4发送帧数据: ${frameData.size} bytes")
Log.v(TAG, "Socket.IO sent frame: ${frameData.size} bytes")
success = true
// Reset throttle counter on success
if (socketUnavailableLogCount > 0) {
Log.i(TAG, "Socket.IO connection restored, " +
"skipped $socketUnavailableLogCount frames while disconnected")
socketUnavailableLogCount = 0
}
} else {
Log.w(TAG, "Socket.IO连接不可用无法发送屏幕数据")
socketUnavailableLogCount++
// Log first occurrence, then every 50th to avoid flooding
if (socketUnavailableLogCount == 1 || socketUnavailableLogCount % 50 == 0) {
Log.w(TAG, "Socket.IO unavailable, cannot send screen data " +
"(count=$socketUnavailableLogCount)")
}
}
// 记录成功发送时间
if (success) {
lastSuccessfulSendTime = System.currentTimeMillis()
}
} catch (e: Exception) {
Log.e(TAG, "处理帧数据失败", e)
Log.e(TAG, "Process frame data failed", e)
}
}