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