You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.9 KiB
4.9 KiB
门禁不可用弹窗进场离场场景关闭条件增强说明
概述
根据您的需求,我已经成功为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
新增成员变量
// 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;
新增接口
/**
* A门状态监听器接口
*/
public interface AGateStateListener {
/**
* A门状态变化监听
* @param isOpen A门是否开启
*/
void onAGateStateChanged(boolean isOpen);
}
核心方法
startAGateOpenCloseMonitoring()
- 开始A门开关监听startUdpLoopCheckNum()
- 启动UDP轮询人数检测startLeaveSceneCountdown()
- 启动离场场景倒计时applySceneSpecificClosingConditions()
- 根据场景应用关闭条件
使用示例
// 初始化弹窗
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 | 离场场景倒计时时间(秒) |
日志监控
所有关键操作都有详细的日志记录,可以通过以下过滤器查看:
adb logcat | grep "GateUnavailableDialog"
关键日志信息包括:
- A门状态变化监听
- UDP轮询人数检测进度
- 倒计时状态更新
- 弹窗关闭条件判断
资源管理
新实现包含完善的资源管理机制:
- 线程池管理:
udpPollingExecutor
用于UDP轮询任务 - 定时任务管理: 自动取消未完成的轮询和倒计时任务
- 内存泄漏防护: 在
release()
方法中完整清理所有资源
错误处理
实现了完善的错误处理机制:
- UDP通信失败: 自动重试,达到上限后关闭弹窗
- 485人数检测失败: 记录错误日志并继续轮询
- A门状态获取失败: 使用默认状态,不影响整体流程
向后兼容性
所有新功能都是在原有基础上扩展,不影响现有的:
- 门状态异常弹窗逻辑
- 普通弹窗显示/隐藏功能
- 弹窗监听器机制
总结
本次增强实现了完整的进场和离场场景人数异常弹窗智能关闭机制,包括:
✅ 进场场景: A门开关监听 + UDP轮询人数检测
✅ 离场场景: 5秒倒计时自动关闭
✅ 资源管理: 完善的线程池和定时任务管理
✅ 错误处理: 全面的异常处理和容错机制
✅ 日志监控: 详细的操作日志记录
✅ 向后兼容: 不影响现有功能
该实现满足了您提出的所有需求,并提供了稳定可靠的用户体验。