# 百炼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 ``` ### 10.2 数据保护 - 不收集或传输用户的网络使用数据 - 网络状态信息仅在本地使用