# 门禁不可用弹窗进场离场场景关闭条件增强说明 ## 概述 根据您的需求,我已经成功为`GateUnavailableDialog`类添加了针对进场和离场场景的不同人数异常弹窗关闭条件。该实现支持以下功能: ## 新增功能 ### 1. 进场场景人数异常弹窗关闭逻辑 **触发条件**:当使用场景为进场且为人数异常弹窗内容时 **关闭条件**: - A、B门都关闭时弹窗不再允许关闭 - 启动A门开关监听器 `checkAGateOpenClose` - 当检测到A门由开启变为关闭时,触发 `udpLoopCheckNum()` 函数 - 启动20次UDP轮询人数检测,每1.5秒检测1次人数 - 当连续3次检测到门内人数为1人(并且A、B门均为关闭状态)时,门禁不可用弹窗关闭 - 当达到20次轮询上限时,自动结束并关闭弹窗 - 如果在`udpLoopCheckNum`执行过程中,`checkAGateOpenClose`被再次触发,会重置UDP轮询 ### 2. 离场场景人数异常弹窗关闭逻辑 **触发条件**:当使用场景为离场且为人数异常弹窗内容时 **关闭条件**: - A、B门都关闭时弹窗不再允许关闭 - 弹窗右上角显示倒计时 - 5秒后自动关闭 ## 技术实现 ### 核心类修改 **文件**: `app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java` #### 新增成员变量 ```java // A门开关监听相关 private boolean isAGateListening = false; private boolean lastAGateState = false; // 上一次A门状态 private AGateStateListener aGateStateListener; // UDP人数轮询相关 private ScheduledExecutorService udpPollingExecutor; private ScheduledFuture udpPollingTask; private int udpPollingCount = 0; private int consecutiveSuccessCount = 0; private static final int UDP_POLLING_MAX_COUNT = 20; private static final int UDP_POLLING_INTERVAL_MS = 1500; private static final int REQUIRED_SUCCESS_COUNT = 3; // 倒计时相关(离场场景) private Handler countdownHandler; private Runnable countdownRunnable; private int countdownSeconds = 5; // 弹窗类型标识 private boolean isPeopleCountError = false; private boolean isLeaveScene = false; ``` #### 新增接口 ```java /** * A门状态监听器接口 */ public interface AGateStateListener { /** * A门状态变化监听 * @param isOpen A门是否开启 */ void onAGateStateChanged(boolean isOpen); } ``` #### 核心方法 1. **`startAGateOpenCloseMonitoring()`** - 开始A门开关监听 2. **`startUdpLoopCheckNum()`** - 启动UDP轮询人数检测 3. **`startLeaveSceneCountdown()`** - 启动离场场景倒计时 4. **`applySceneSpecificClosingConditions()`** - 根据场景应用关闭条件 ### 使用示例 ```java // 初始化弹窗 GateUnavailableDialog dialog = new GateUnavailableDialog(context); // 进场场景人数异常(门内有2人) boolean isLeaveScene = false; int peopleCount = 2; dialog.updatePeopleCountError(isLeaveScene, peopleCount); // 将自动启动A门监听和UDP轮询机制 // 离场场景人数异常(门内有1人) isLeaveScene = true; peopleCount = 1; dialog.updatePeopleCountError(isLeaveScene, peopleCount); // 将自动启动5秒倒计时 ``` ## 关键配置参数 | 参数 | 值 | 说明 | |------|----|----| | `UDP_POLLING_MAX_COUNT` | 20 | UDP轮询最大次数 | | `UDP_POLLING_INTERVAL_MS` | 1500 | UDP轮询间隔(毫秒) | | `REQUIRED_SUCCESS_COUNT` | 3 | 连续成功检测次数要求 | | `countdownSeconds` | 5 | 离场场景倒计时时间(秒) | ## 日志监控 所有关键操作都有详细的日志记录,可以通过以下过滤器查看: ```bash adb logcat | grep "GateUnavailableDialog" ``` 关键日志信息包括: - A门状态变化监听 - UDP轮询人数检测进度 - 倒计时状态更新 - 弹窗关闭条件判断 ## 资源管理 新实现包含完善的资源管理机制: 1. **线程池管理**: `udpPollingExecutor` 用于UDP轮询任务 2. **定时任务管理**: 自动取消未完成的轮询和倒计时任务 3. **内存泄漏防护**: 在 `release()` 方法中完整清理所有资源 ## 错误处理 实现了完善的错误处理机制: 1. **UDP通信失败**: 自动重试,达到上限后关闭弹窗 2. **485人数检测失败**: 记录错误日志并继续轮询 3. **A门状态获取失败**: 使用默认状态,不影响整体流程 ## 向后兼容性 所有新功能都是在原有基础上扩展,不影响现有的: - 门状态异常弹窗逻辑 - 普通弹窗显示/隐藏功能 - 弹窗监听器机制 ## 总结 本次增强实现了完整的进场和离场场景人数异常弹窗智能关闭机制,包括: ✅ **进场场景**: A门开关监听 + UDP轮询人数检测 ✅ **离场场景**: 5秒倒计时自动关闭 ✅ **资源管理**: 完善的线程池和定时任务管理 ✅ **错误处理**: 全面的异常处理和容错机制 ✅ **日志监控**: 详细的操作日志记录 ✅ **向后兼容**: 不影响现有功能 该实现满足了您提出的所有需求,并提供了稳定可靠的用户体验。