# Fix 9 - 实时门禁监听修复验证 ## 问题回顾 **原始问题**:当处于OrderSelectionActivity页面进行订单选择核销时,检测到A门打开了,但app没有立即关闭选择核销弹窗。 **根本原因**:之前只实现了静态检查(用户点击时检查),缺少实时监听门禁状态变化的机制。 ## 修复方案 ### 🔧 核心改动 #### 1. 实现 GateUnavailableListener 接口 ```java public class OrderSelectionActivity extends AppCompatActivity implements GateABController.GateUnavailableListener ``` #### 2. 添加实时监听器注册 ```java private void initGateStatusCheck() { // 获取GateABController实例并设置监听器 gateController = GateABController.getInstance(); if (gateController != null) { // 设置本 Activity 为门禁状态监听器 gateController.setGateStateListener(this); LogManager.logInfo(TAG, "Fix 9 - 门禁状态实时监听初始化完成"); } } ``` #### 3. 实现关键回调方法 ```java @Override public void onGateUnavailable(String reason) { LogManager.logWarning(TAG, "Fix 9 - 检测到门禁不可用,立即关闭订单选择页面。原因: " + reason); runOnUiThread(() -> { // 停止倒计时 stopCountdown(); // 设置结果为取消并关闭Activity setResult(RESULT_CANCELED); finish(); }); } ``` #### 4. 资源清理 ```java @Override protected void onDestroy() { // Fix 9: 清理门禁状态监听器 if (gateController != null) { gateController.setGateStateListener(null); } } ``` ### 🚀 工作流程 1. **Activity启动**:OrderSelectionActivity创建时注册为门禁状态监听器 2. **实时监听**:GateABController实时监听UDP门禁状态变化 3. **状态检测**:当A门或B门状态变为开启时,GateABController触发onGateUnavailable回调 4. **立即响应**:OrderSelectionActivity接收回调后立即关闭Activity 5. **资源清理**:Activity销毁时清理监听器 ### 📊 验证要点 #### 测试场景1:A门开启 - **预期**:OrderSelectionActivity立即关闭 - **验证**:日志中应显示"Fix 9 - 检测到门禁不可用,立即关闭订单选择页面" #### 测试场景2:B门开启 - **预期**:OrderSelectionActivity立即关闭 - **验证**:同上 #### 测试场景3:UDP连接断开 - **预期**:根据场景判断是否关闭(离场设备可能不关闭) - **验证**:查看VenueSceneUtils.isLeaveScene()的判断逻辑 #### 测试场景4:门禁状态恢复正常 - **预期**:如果Activity已关闭,不会重新打开 - **验证**:onGateAvailable被调用但Activity已销毁 ### 🔍 关键技术点 1. **多层检查机制**: - 静态检查(用户点击时) - 实时监听(状态变化时) 2. **线程安全**: - 使用runOnUiThread确保UI操作在主线程执行 3. **资源管理**: - 注册监听器时保存引用 - onDestroy时清理监听器 4. **异常处理**: - 所有关键操作都有try-catch保护 ### ✅ 修复验证 根据用户提供的日志: ``` 2025-09-14 19:46:58.397 GateUnavailableDialog: 更新门状态异常弹窗内容: 检测到A门开启,请先关闭A门 2025-09-14 19:46:58.399 GateUnavailableDialog: 弹窗已显示,仅更新内容 ``` **修复前**:只有GateUnavailableDialog更新了内容,OrderSelectionActivity没有响应 **修复后**:OrderSelectionActivity会通过onGateUnavailable回调立即关闭 ### 🎯 预期效果 当用户在订单选择页面时,如果A门打开: 1. GateABController检测到A门状态变化 2. 触发updateGateState方法 3. 调用OrderSelectionActivity的onGateUnavailable 4. OrderSelectionActivity立即关闭 5. 用户返回到主界面,看到门禁不可用弹窗 ## 总结 Fix 9 现在提供了完整的实时门禁状态监听机制,确保当门禁状态在OrderSelectionActivity显示期间发生异常时,能够立即响应并关闭Activity,从而提升用户体验和系统安全性。