diff --git a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java index 8eed3cf..f6433a0 100644 --- a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java @@ -747,20 +747,19 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi LogManager.logInfo(TAG, "门禁不可用弹窗关闭,恢复正常门禁监控"); // 人数异常弹窗关闭后,恢复正常的门禁监控状态 try { - // 检查UDP是否正常初始化,如果没有则重新初始化 - if (gateABController != null && !gateABController.isUDPInitialized()) { - LogManager.logInfo(TAG, "UDP未初始化,重新初始化UDP门禁控制"); + if (gateABController != null) { + // 修复关键问题:无论UDP是否初始化,都需要重新初始化来重置状态缓存 + LogManager.logInfo(TAG, "重新初始化UDP门禁控制以重置状态缓存"); gateABController.reinitializeUDP(); + // 稍等片刻后启动轮询,确保初始化完成 new Handler(Looper.getMainLooper()).postDelayed(() -> { if (gateABController != null) { gateABController.startUDPPolling(); - LogManager.logInfo(TAG, "UDP门禁状态轮询已重新启动"); + LogManager.logInfo(TAG, "UDP门禁状态轮询已重新启动,状态缓存已重置"); } }, 500); - } - - if (gateABController != null) { + LogManager.logInfo(TAG, "门禁监控已恢复,当前门状态监听器正常运行"); } } catch (Exception e) { diff --git a/app/src/main/java/com/ouxuan/oxface/device/GateABController.java b/app/src/main/java/com/ouxuan/oxface/device/GateABController.java index a1907da..6100268 100644 --- a/app/src/main/java/com/ouxuan/oxface/device/GateABController.java +++ b/app/src/main/java/com/ouxuan/oxface/device/GateABController.java @@ -1163,8 +1163,17 @@ public class GateABController { public void reinitializeUDP() { if (context != null && udpController != null) { LogManager.logInfo(TAG, "重新初始化UDP控制器"); + + // 重置UDP状态缓存,确保下次状态更新能正常触发 + udpController.resetGateStateCache(); + + // 重新初始化UDP连接 udpController.initUDP(context); + + // 重新设置监听器 setupUDPStateListener(); + + LogManager.logInfo(TAG, "UDP控制器重新初始化完成,状态缓存已重置"); } else { LogManager.logWarning(TAG, "无法重新初始化UDP,context或udpController为空"); } diff --git a/app/src/main/java/com/ouxuan/oxface/device/OxUDP.java b/app/src/main/java/com/ouxuan/oxface/device/OxUDP.java index bc52ed2..ad00a1f 100644 --- a/app/src/main/java/com/ouxuan/oxface/device/OxUDP.java +++ b/app/src/main/java/com/ouxuan/oxface/device/OxUDP.java @@ -443,11 +443,15 @@ public class OxUDP { // Log.d(TAG, "门禁状态 - A门: " + (gateAState ? "开启" : "关闭") + // ", B门: " + (gateBState ? "开启" : "关闭")); - Log.e(TAG, "parseGateState: isFirstStateUpdate:"+isFirstStateUpdate +" |lastGateAState:"+lastGateAState+" |lastGateBState:"+lastGateBState); + Log.e(TAG, "parseGateState: isFirstStateUpdate:" + isFirstStateUpdate + + " |lastGateAState:" + lastGateAState + " |lastGateBState:" + lastGateBState + + " |currentGateAState:" + gateAState + " |currentGateBState:" + gateBState); + // 检查状态是否发生变化,只有变化时才通知监听器 if (isFirstStateUpdate || gateAState != lastGateAState || gateBState != lastGateBState) { Log.i(TAG, "门禁状态变化 - A门: " + (lastGateAState ? "开启" : "关闭") + " -> " + (gateAState ? "开启" : "关闭") + - ", B门: " + (lastGateBState ? "开启" : "关闭") + " -> " + (gateBState ? "开启" : "关闭")); + ", B门: " + (lastGateBState ? "开启" : "关闭") + " -> " + (gateBState ? "开启" : "关闭") + + " [首次更新: " + isFirstStateUpdate + "]"); // 更新状态缓存 lastGateAState = gateAState; @@ -457,9 +461,9 @@ public class OxUDP { // 通知监听器状态变化 notifyGateStateUpdate(gateAState, gateBState, response); } else { - // 状态无变化,不通知监听器,只记录调试日志 - // Log.d(TAG, "门禁状态无变化 - A门: " + (gateAState ? "开启" : "关闭") + - // ", B门: " + (gateBState ? "开启" : "关闭")); + // 状态无变化,记录调试日志 + Log.d(TAG, "门禁状态无变化 - A门: " + (gateAState ? "开启" : "关闭") + + ", B门: " + (gateBState ? "开启" : "关闭") + " [跳过通知]"); } } catch (Exception e) { @@ -592,6 +596,19 @@ public class OxUDP { } /** + * 重置门状态缓存(用于恢复监听器链条) + */ + public void resetGateStateCache() { + Log.i(TAG, "重置前的门状态缓存 - A门: " + lastGateAState + ", B门: " + lastGateBState + ", 首次更新: " + isFirstStateUpdate); + + lastGateAState = false; + lastGateBState = false; + isFirstStateUpdate = true; + + Log.i(TAG, "门状态缓存已重置,下次状态更新将被视为首次更新,确保能正常触发状态变化检测"); + } + + /** * 停止UDP服务 */ public void stop() {