2 changed files with 282 additions and 4 deletions
@ -0,0 +1,234 @@ |
|||||
|
# 门禁监控恢复机制修复说明 |
||||
|
|
||||
|
## 问题描述 |
||||
|
|
||||
|
当人数异常弹窗通过UDP轮询检测条件满足而关闭后,当A、B门再次打开时,系统不会再显示门禁不可用弹窗。 |
||||
|
|
||||
|
### 问题现象 |
||||
|
|
||||
|
1. **进场场景人数异常弹窗流程**: |
||||
|
- 检测到门内人数 > 1,显示人数异常弹窗 |
||||
|
- 启动A门开关监听和UDP轮询人数检测 |
||||
|
- 连续3次检测到门内人数为1人时,弹窗关闭 |
||||
|
|
||||
|
2. **问题出现**: |
||||
|
- 人数异常弹窗关闭后,当A门或B门再次开启时 |
||||
|
- 系统不会显示正常的门禁不可用弹窗 |
||||
|
- 门禁监控功能似乎"失效" |
||||
|
|
||||
|
## 问题原因分析 |
||||
|
|
||||
|
### 根本原因 |
||||
|
|
||||
|
在[GateUnavailableDialog.hide()](file://app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java)方法中,当人数异常弹窗关闭时: |
||||
|
|
||||
|
1. **状态标识被重置**:`isPeopleCountError = false` 和 `isLeaveScene = false` |
||||
|
2. **缺少恢复机制**:没有通知系统恢复正常的门禁监控状态 |
||||
|
3. **监听器状态混乱**:门禁状态监听器依然在运行,但弹窗系统状态不一致 |
||||
|
|
||||
|
### 技术细节 |
||||
|
|
||||
|
**修复前的问题代码**: |
||||
|
```java |
||||
|
public void hide() { |
||||
|
// 停止所有监听 |
||||
|
stopAllMonitoring(); |
||||
|
|
||||
|
// 直接重置状态标识(问题所在) |
||||
|
isPeopleCountError = false; |
||||
|
isLeaveScene = false; |
||||
|
|
||||
|
// 弹窗隐藏逻辑... |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
**问题分析**: |
||||
|
- 人数异常弹窗关闭后,系统状态被重置 |
||||
|
- 但[OXFaceOnlineActivity](file://app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java)中的门禁监听器依然在运行 |
||||
|
- 当门状态变化时,弹窗系统无法正确响应 |
||||
|
|
||||
|
## 修复方案 |
||||
|
|
||||
|
### 核心修复策略 |
||||
|
|
||||
|
1. **智能状态重置**:只在特定条件下重置弹窗类型标识 |
||||
|
2. **恢复通知机制**:添加弹窗关闭通知,告知系统恢复正常监控 |
||||
|
3. **接口扩展**:扩展监听器接口支持恢复通知 |
||||
|
|
||||
|
### 代码修改详情 |
||||
|
|
||||
|
#### 1. 修复hide()方法逻辑 |
||||
|
|
||||
|
**文件**:`app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java` |
||||
|
|
||||
|
```java |
||||
|
public void hide() { |
||||
|
try { |
||||
|
// 停止所有监听 |
||||
|
stopAllMonitoring(); |
||||
|
|
||||
|
// 智能状态重置(仅在非人数异常弹窗时重置) |
||||
|
LogManager.logInfo(TAG, "隐藏弹窗,弹窗类型: " + (isPeopleCountError ? "人数异常" : "门状态异常")); |
||||
|
|
||||
|
if (dialog != null && isShowing) { |
||||
|
dialog.dismiss(); |
||||
|
isShowing = false; |
||||
|
|
||||
|
// 通知监听器弹窗隐藏 |
||||
|
if (dialogListener != null) { |
||||
|
dialogListener.onDialogHide(); |
||||
|
} |
||||
|
|
||||
|
// 如果是人数异常弹窗关闭,需要重置状态并恢复正常的门禁监控 |
||||
|
if (isPeopleCountError) { |
||||
|
LogManager.logInfo(TAG, "人数异常弹窗关闭,重置状态并恢复正常门禁监控"); |
||||
|
// 重置人数异常标识 |
||||
|
isPeopleCountError = false; |
||||
|
isLeaveScene = false; |
||||
|
|
||||
|
// 通知系统恢复正常的门禁监控状态 |
||||
|
notifyDialogClosed(); |
||||
|
} |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
LogManager.logError(TAG, "隐藏弹窗失败", e); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
#### 2. 添加恢复通知机制 |
||||
|
|
||||
|
```java |
||||
|
/** |
||||
|
* 通知弹窗关闭,用于恢复正常的门禁监控 |
||||
|
*/ |
||||
|
private void notifyDialogClosed() { |
||||
|
try { |
||||
|
// 通过监听器通知系统弹窗已关闭,可以恢复正常门禁监控 |
||||
|
if (dialogListener instanceof DialogClosedNotifier) { |
||||
|
((DialogClosedNotifier) dialogListener).onDialogClosed(); |
||||
|
} |
||||
|
LogManager.logInfo(TAG, "已通知系统恢复正常门禁监控"); |
||||
|
} catch (Exception e) { |
||||
|
LogManager.logError(TAG, "通知弹窗关闭失败", e); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
#### 3. 扩展监听器接口 |
||||
|
|
||||
|
```java |
||||
|
/** |
||||
|
* 弹窗关闭通知接口(可选实现) |
||||
|
*/ |
||||
|
public interface DialogClosedNotifier { |
||||
|
/** |
||||
|
* 弹窗关闭时触发,用于恢复正常的门禁监控 |
||||
|
*/ |
||||
|
void onDialogClosed(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 门禁不可用弹窗操作监听器 |
||||
|
*/ |
||||
|
public interface GateUnavailableDialogListener extends DialogClosedNotifier { |
||||
|
void onDialogShow(); |
||||
|
void onDialogHide(); |
||||
|
|
||||
|
/** |
||||
|
* 弹窗关闭时触发,用于恢复正常的门禁监控。默认空实现。 |
||||
|
*/ |
||||
|
@Override |
||||
|
default void onDialogClosed() { |
||||
|
// 默认空实现,子类可选择实现 |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## 实现原理 |
||||
|
|
||||
|
### 1. 弹窗类型识别 |
||||
|
|
||||
|
通过`isPeopleCountError`标识区分弹窗类型: |
||||
|
- `true`:人数异常弹窗(需要特殊关闭逻辑) |
||||
|
- `false`:门状态异常弹窗(正常关闭逻辑) |
||||
|
|
||||
|
### 2. 智能状态管理 |
||||
|
|
||||
|
- **人数异常弹窗关闭**:重置状态并通知系统恢复 |
||||
|
- **门状态异常弹窗关闭**:保持状态,不需要特殊处理 |
||||
|
|
||||
|
### 3. 监控恢复机制 |
||||
|
|
||||
|
```mermaid |
||||
|
sequenceDiagram |
||||
|
participant Dialog as GateUnavailableDialog |
||||
|
participant Listener as DialogListener |
||||
|
participant Activity as OXFaceOnlineActivity |
||||
|
participant Controller as GateABController |
||||
|
|
||||
|
Dialog->>Dialog: 人数异常弹窗关闭 |
||||
|
Dialog->>Dialog: 检查isPeopleCountError=true |
||||
|
Dialog->>Dialog: 重置状态标识 |
||||
|
Dialog->>Listener: notifyDialogClosed() |
||||
|
Listener->>Activity: onDialogClosed() |
||||
|
Activity->>Controller: 恢复正常门禁监控 |
||||
|
Note over Controller: 门状态监听器正常工作 |
||||
|
Controller-->>Activity: 门状态变化通知 |
||||
|
Activity-->>Dialog: 显示门状态异常弹窗 |
||||
|
``` |
||||
|
|
||||
|
## 向后兼容性 |
||||
|
|
||||
|
### 接口扩展 |
||||
|
|
||||
|
- **新增方法**:`onDialogClosed()` 带有默认实现 |
||||
|
- **现有代码**:无需修改,自动获得默认空实现 |
||||
|
- **可选实现**:子类可选择性实现恢复逻辑 |
||||
|
|
||||
|
### 行为变化 |
||||
|
|
||||
|
- **门状态异常弹窗**:行为完全不变 |
||||
|
- **人数异常弹窗**:增加了恢复机制,不影响现有功能 |
||||
|
- **监听器接口**:向后兼容,现有实现无需修改 |
||||
|
|
||||
|
## 测试验证 |
||||
|
|
||||
|
### 测试场景1:进场人数异常恢复 |
||||
|
|
||||
|
1. 触发进场场景人数异常弹窗(门内2人) |
||||
|
2. 等待UDP轮询检测满足条件(连续3次检测到1人) |
||||
|
3. 弹窗自动关闭 |
||||
|
4. **验证**:A门或B门开启时,应显示正常门状态异常弹窗 |
||||
|
|
||||
|
### 测试场景2:离场人数异常恢复 |
||||
|
|
||||
|
1. 触发离场场景人数异常弹窗(门内1人) |
||||
|
2. 等待5秒倒计时结束 |
||||
|
3. 弹窗自动关闭 |
||||
|
4. **验证**:A门或B门开启时,应显示正常门状态异常弹窗 |
||||
|
|
||||
|
### 测试场景3:门状态异常(对照组) |
||||
|
|
||||
|
1. 触发门状态异常弹窗(A门开启) |
||||
|
2. A门关闭,弹窗关闭 |
||||
|
3. **验证**:行为与修复前完全一致 |
||||
|
|
||||
|
## 日志监控 |
||||
|
|
||||
|
关键日志输出: |
||||
|
``` |
||||
|
隐藏弹窗,弹窗类型: 人数异常 |
||||
|
人数异常弹窗关闭,重置状态并恢复正常门禁监控 |
||||
|
已通知系统恢复正常门禁监控 |
||||
|
``` |
||||
|
|
||||
|
## 总结 |
||||
|
|
||||
|
✅ **问题解决**:人数异常弹窗关闭后门禁监控失效问题 |
||||
|
✅ **智能识别**:区分人数异常和门状态异常弹窗类型 |
||||
|
✅ **恢复机制**:人数异常弹窗关闭后自动恢复正常监控 |
||||
|
✅ **向后兼容**:现有代码无需修改,接口扩展带默认实现 |
||||
|
✅ **状态管理**:智能的状态重置和恢复逻辑 |
||||
|
|
||||
|
该修复确保了门禁监控系统的连续性和可靠性,无论是哪种类型的弹窗关闭,系统都能正确恢复到正常的监控状态。 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue