372 lines
12 KiB
Markdown
372 lines
12 KiB
Markdown
# 百炼AI模型初始化网络检查设计文档
|
||
|
||
## 1. 概述
|
||
|
||
### 1.1 背景
|
||
当前机器人应用在启动时会初始化百炼AI模型,但未检查网络连接状态。在网络不可用的情况下初始化AI模型可能导致连接失败、重试消耗资源或功能异常。此外,应用在`onErrorReceived`回调中已实现了重连机制,需要确保新增的网络监听机制不会与现有重连逻辑冲突。
|
||
|
||
### 1.2 目标
|
||
实现一个网络状态检查和监听机制,在AI模型初始化前检查网络连接状态,并动态监听网络变化以释放或重新初始化AI模型。网络状态监听应在应用权限授权之后启动。需要确保新增的网络监听机制与现有的`onErrorReceived`重连逻辑协同工作,避免冲突。
|
||
|
||
### 1.3 范围
|
||
本设计主要涉及`MainActivity`中的AI模型初始化逻辑和网络状态监听功能。
|
||
|
||
## 2. 架构设计
|
||
|
||
### 2.1 当前架构分析
|
||
```mermaid
|
||
graph TD
|
||
A[MainActivity] --> B[MultiModalDialog]
|
||
A --> C[权限检查]
|
||
C --> D[initializeParams]
|
||
D --> E[initializeSDK]
|
||
E --> F[AI模型初始化]
|
||
```
|
||
|
||
### 2.2 改进后的架构
|
||
```mermaid
|
||
graph TD
|
||
A[MainActivity] --> B[权限检查]
|
||
B --> C{权限是否授予?}
|
||
C -->|是| D[初始化网络状态管理器]
|
||
C -->|否| E[请求权限]
|
||
D --> F[启动网络状态监听器]
|
||
D --> G{网络是否可用?}
|
||
G -->|是| H[初始化AI模型]
|
||
G -->|否| I[等待网络连接]
|
||
F --> J{网络状态变化}
|
||
J -->|连接| K[初始化/重新初始化AI模型]
|
||
J -->|断开| L[释放AI模型资源]
|
||
```
|
||
|
||
## 3. 核心组件设计
|
||
|
||
### 3.1 网络状态检查器
|
||
负责在AI模型初始化前检查网络连接状态。
|
||
|
||
#### 3.1.1 功能需求
|
||
- 检查当前网络连接状态(WiFi/移动数据)
|
||
- 检查网络是否可访问互联网
|
||
- 提供同步和异步检查方法
|
||
- 确保在网络状态监听前已完成权限检查
|
||
|
||
#### 3.1.2 接口设计
|
||
```java
|
||
public class NetworkStateManager {
|
||
// 检查网络是否连接
|
||
public boolean isNetworkConnected();
|
||
|
||
// 检查网络是否可访问互联网
|
||
public boolean isInternetAvailable();
|
||
|
||
// 异步检查网络状态
|
||
public void checkNetworkStatus(NetworkStatusCallback callback);
|
||
}
|
||
```
|
||
|
||
### 3.2 网络状态监听器
|
||
动态监听网络状态变化,根据变化触发AI模型的初始化或释放。网络状态监听器应在应用权限授权之后启动。
|
||
|
||
#### 3.2.1 功能需求
|
||
- 监听网络连接和断开事件
|
||
- 网络状态变化时通知订阅者
|
||
- 提供注册和注销监听器的方法
|
||
- 确保在权限检查通过后才启动监听
|
||
|
||
#### 3.2.2 接口设计
|
||
```java
|
||
public class NetworkStateListener {
|
||
// 注册网络状态监听器
|
||
public void registerNetworkCallback(NetworkStateCallback callback);
|
||
|
||
// 注销网络状态监听器
|
||
public void unregisterNetworkCallback(NetworkStateCallback callback);
|
||
|
||
// 检查监听器是否已启动
|
||
public boolean isListenerStarted();
|
||
}
|
||
|
||
public interface NetworkStateCallback {
|
||
void onNetworkConnected();
|
||
void onNetworkDisconnected();
|
||
}
|
||
```
|
||
|
||
### 3.3 AI模型管理器
|
||
负责AI模型的初始化、释放和状态管理。
|
||
|
||
#### 3.3.1 功能需求
|
||
- 初始化AI模型(调用现有initializeSDK流程)
|
||
- 释放AI模型资源(调用destroy方法)
|
||
- 管理AI模型状态(已初始化/未初始化)
|
||
- 与现有onErrorReceived重连机制协同工作,避免重复初始化
|
||
- 提供统一的初始化和释放接口,确保任何地方的初始化/释放操作都通过该管理器进行
|
||
|
||
#### 3.3.2 接口设计
|
||
```java
|
||
public class AIModelManager {
|
||
// 初始化AI模型
|
||
public void initializeAIModel();
|
||
|
||
// 释放AI模型
|
||
public void releaseAIModel();
|
||
|
||
// 检查AI模型是否已初始化
|
||
public boolean isAIModelInitialized();
|
||
|
||
// 检查AI模型是否正在初始化
|
||
public boolean isAIModelInitializing();
|
||
}
|
||
```
|
||
|
||
## 4. 实现方案
|
||
|
||
### 4.1 网络状态检查实现
|
||
|
||
#### 4.1.1 网络连接检查
|
||
使用Android的ConnectivityManager检查网络连接状态:
|
||
|
||
```java
|
||
public boolean isNetworkConnected() {
|
||
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||
if (cm != null) {
|
||
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
|
||
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
|
||
}
|
||
return false;
|
||
}
|
||
```
|
||
|
||
#### 4.1.2 互联网访问检查
|
||
通过连接测试检查是否可以访问互联网:
|
||
|
||
```java
|
||
public boolean isInternetAvailable() {
|
||
try {
|
||
InetAddress address = InetAddress.getByName("www.baidu.com");
|
||
return !address.equals("");
|
||
} catch (Exception e) {
|
||
return false;
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.2 网络状态监听实现
|
||
|
||
#### 4.2.1 监听器注册
|
||
使用ConnectivityManager的NetworkCallback监听网络变化:
|
||
|
||
```java
|
||
private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
|
||
@Override
|
||
public void onAvailable(Network network) {
|
||
// 网络可用
|
||
notifyNetworkConnected();
|
||
}
|
||
|
||
@Override
|
||
public void onLost(Network network) {
|
||
// 网络丢失
|
||
notifyNetworkDisconnected();
|
||
}
|
||
};
|
||
```
|
||
|
||
网络状态监听应在应用权限授权之后启动,以确保应用具有必要的权限来访问网络状态信息。监听器的启动应与应用的生命周期保持一致,在应用进入前台时启动监听,在应用退出时停止监听。
|
||
|
||
### 4.3 AI模型管理实现
|
||
|
||
#### 4.3.1 初始化流程
|
||
修改现有的初始化流程,添加网络检查:
|
||
|
||
```java
|
||
private void initializeSDKWithNetworkCheck() {
|
||
// 确保权限已授予后再进行网络检查
|
||
if (networkStateManager.isNetworkConnected() && networkStateManager.isInternetAvailable()) {
|
||
initializeSDK();
|
||
} else {
|
||
// 等待网络连接
|
||
networkStateListener.registerNetworkCallback(networkCallback);
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4.3.2 动态管理
|
||
根据网络状态变化动态初始化或释放AI模型:
|
||
|
||
```java
|
||
private NetworkStateCallback networkCallback = new NetworkStateCallback() {
|
||
@Override
|
||
public void onNetworkConnected() {
|
||
// 检查是否需要初始化AI模型
|
||
// 如果AI模型未初始化或已释放,则初始化
|
||
// 同时检查是否正在初始化,避免与onErrorReceived中的重连机制冲突
|
||
if (!aiModelManager.isAIModelInitialized() && !aiModelManager.isAIModelInitializing()) {
|
||
aiModelManager.initializeAIModel();
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onNetworkDisconnected() {
|
||
// 网络断开时,释放AI模型资源
|
||
if (aiModelManager.isAIModelInitialized()) {
|
||
aiModelManager.releaseAIModel();
|
||
}
|
||
}
|
||
};
|
||
```
|
||
|
||
网络状态监听器应在权限检查通过后启动,确保应用具有必要的权限来访问网络状态信息。
|
||
|
||
#### 4.3.3 与现有重连机制的协同
|
||
为了避免与`onErrorReceived`中的重连机制冲突,需要实现以下协调机制:
|
||
|
||
1. 在`onErrorReceived`回调中,检查网络状态管理器的状态,仅在网络确实可用的情况下进行重连。
|
||
2. 添加重连状态标记,避免在网络监听器和错误回调中同时触发初始化。
|
||
3. 实现统一的AI模型状态管理,确保任何初始化或释放操作都通过AI模型管理器进行。
|
||
|
||
```java
|
||
@Override
|
||
public void onErrorReceived(@NonNull TYError errorInfo) {
|
||
Log.e(TAG_AI, "收到错误: " + errorInfo);
|
||
// 检查网络状态
|
||
if (networkStateManager.isNetworkConnected() && networkStateManager.isInternetAvailable()) {
|
||
// 网络可用时才进行重连
|
||
new Thread(() -> {
|
||
try {
|
||
if (multiModalDialog != null) {
|
||
multiModalDialog.destroy();
|
||
}
|
||
if (audioPlayer != null) {
|
||
audioPlayer.stop(true, false);
|
||
audioPlayer.releaseAudioTrack(true);
|
||
}
|
||
if (audioRecorder != null) {
|
||
audioRecorder.pause();
|
||
}
|
||
Thread.sleep(1000);
|
||
// 通过AI模型管理器初始化,避免与网络监听器冲突
|
||
aiModelManager.initializeAIModel();
|
||
} catch (InterruptedException e) {
|
||
throw new RuntimeException(e);
|
||
}
|
||
}).start();
|
||
} else {
|
||
// 网络不可用时,依赖网络监听器处理
|
||
Log.d(TAG_AI, "网络不可用,等待网络连接后重试");
|
||
}
|
||
}
|
||
```
|
||
|
||
## 5. 数据模型
|
||
|
||
### 5.1 网络状态模型
|
||
```java
|
||
public enum NetworkState {
|
||
CONNECTED, // 网络已连接
|
||
DISCONNECTED, // 网络已断开
|
||
CONNECTING, // 网络连接中
|
||
UNKNOWN // 网络状态未知
|
||
}
|
||
```
|
||
|
||
### 5.2 AI模型状态模型
|
||
```java
|
||
public enum AIModelState {
|
||
INITIALIZED, // 已初始化
|
||
UNINITIALIZED, // 未初始化
|
||
INITIALIZING, // 初始化中
|
||
RELEASING // 释放中
|
||
}
|
||
```
|
||
|
||
## 6. 流程设计
|
||
|
||
### 6.1 应用启动流程
|
||
```mermaid
|
||
graph TD
|
||
A[应用启动] --> B[权限检查]
|
||
B --> C{权限是否授予?}
|
||
C -->|是| D[初始化网络状态管理器]
|
||
C -->|否| E[请求权限]
|
||
D --> F{网络是否可用?}
|
||
F -->|是| G[初始化AI模型]
|
||
F -->|否| H[注册网络监听器并等待]
|
||
E --> C
|
||
```
|
||
|
||
网络状态监听器的启动应放在权限检查之后,确保应用具有必要的权限后再监听网络状态变化。
|
||
|
||
### 6.2 网络状态变化处理流程
|
||
```mermaid
|
||
graph TD
|
||
A[网络状态变化] --> B{变为连接状态?}
|
||
B -->|是| C{AI模型是否已初始化?}
|
||
C -->|否| D[初始化AI模型]
|
||
C -->|是| E[保持现状]
|
||
B -->|否| F{AI模型是否已初始化?}
|
||
F -->|是| G[释放AI模型]
|
||
F -->|否| H[保持现状]
|
||
```
|
||
|
||
## 7. 异常处理
|
||
|
||
### 7.1 网络检查异常
|
||
- 网络状态检查失败时,默认认为网络不可用
|
||
- 记录日志并继续执行应用启动流程
|
||
|
||
### 7.2 AI模型初始化异常
|
||
- 初始化失败时,记录错误信息
|
||
- 设置重试机制,在网络状态变化时重新尝试初始化
|
||
|
||
### 7.3 监听器注册异常
|
||
- 监听器注册失败时,使用轮询方式定期检查网络状态
|
||
- 记录错误信息并上报
|
||
|
||
### 7.4 重连机制冲突处理
|
||
- 实现统一的AI模型状态管理,避免网络监听器和onErrorReceived重连机制同时触发初始化
|
||
- 添加重连状态标记,防止重复初始化
|
||
- 在onErrorReceived中检查网络状态,仅在网络确实可用时进行重连
|
||
|
||
## 8. 测试策略
|
||
|
||
### 8.1 单元测试
|
||
1. 网络状态检查功能测试
|
||
- 网络连接状态检查
|
||
- 互联网访问检查
|
||
2. 网络状态监听功能测试
|
||
- 网络连接事件处理
|
||
- 网络断开事件处理
|
||
3. AI模型管理功能测试
|
||
- AI模型初始化
|
||
- AI模型释放
|
||
|
||
### 8.2 集成测试
|
||
1. 网络状态变化时AI模型的动态管理
|
||
2. 应用启动时网络不可用情况下的处理
|
||
3. 网络恢复后AI模型的自动初始化
|
||
|
||
## 9. 性能考虑
|
||
|
||
### 9.1 网络检查性能
|
||
- 网络状态检查应快速响应,避免阻塞主线程
|
||
- 互联网访问检查应设置合理的超时时间
|
||
|
||
### 9.2 资源管理
|
||
- 及时释放网络监听器资源
|
||
- 避免频繁初始化和释放AI模型
|
||
- 合理设置网络状态检查间隔
|
||
- 在onErrorReceived中复用AI模型管理器的初始化方法,避免重复代码
|
||
|
||
## 10. 安全考虑
|
||
|
||
### 10.1 权限要求
|
||
需要以下权限来检查网络状态:
|
||
```xml
|
||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||
<uses-permission android:name="android.permission.INTERNET" />
|
||
```
|
||
|
||
### 10.2 数据保护
|
||
- 不收集或传输用户的网络使用数据
|
||
- 网络状态信息仅在本地使用 |