iB86/.qoder/quests/model-init-network-check.md

12 KiB
Raw Blame History

百炼AI模型初始化网络检查设计文档

1. 概述

1.1 背景

当前机器人应用在启动时会初始化百炼AI模型但未检查网络连接状态。在网络不可用的情况下初始化AI模型可能导致连接失败、重试消耗资源或功能异常。此外应用在onErrorReceived回调中已实现了重连机制,需要确保新增的网络监听机制不会与现有重连逻辑冲突。

1.2 目标

实现一个网络状态检查和监听机制在AI模型初始化前检查网络连接状态并动态监听网络变化以释放或重新初始化AI模型。网络状态监听应在应用权限授权之后启动。需要确保新增的网络监听机制与现有的onErrorReceived重连逻辑协同工作,避免冲突。

1.3 范围

本设计主要涉及MainActivity中的AI模型初始化逻辑和网络状态监听功能。

2. 架构设计

2.1 当前架构分析

graph TD
    A[MainActivity] --> B[MultiModalDialog]
    A --> C[权限检查]
    C --> D[initializeParams]
    D --> E[initializeSDK]
    E --> F[AI模型初始化]

2.2 改进后的架构

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 接口设计

public class NetworkStateManager {
    // 检查网络是否连接
    public boolean isNetworkConnected();
    
    // 检查网络是否可访问互联网
    public boolean isInternetAvailable();
    
    // 异步检查网络状态
    public void checkNetworkStatus(NetworkStatusCallback callback);
}

3.2 网络状态监听器

动态监听网络状态变化根据变化触发AI模型的初始化或释放。网络状态监听器应在应用权限授权之后启动。

3.2.1 功能需求

  • 监听网络连接和断开事件
  • 网络状态变化时通知订阅者
  • 提供注册和注销监听器的方法
  • 确保在权限检查通过后才启动监听

3.2.2 接口设计

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 接口设计

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检查网络连接状态

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 互联网访问检查

通过连接测试检查是否可以访问互联网:

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监听网络变化

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 初始化流程

修改现有的初始化流程,添加网络检查:

private void initializeSDKWithNetworkCheck() {
    // 确保权限已授予后再进行网络检查
    if (networkStateManager.isNetworkConnected() && networkStateManager.isInternetAvailable()) {
        initializeSDK();
    } else {
        // 等待网络连接
        networkStateListener.registerNetworkCallback(networkCallback);
    }
}

4.3.2 动态管理

根据网络状态变化动态初始化或释放AI模型

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模型管理器进行。
@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 网络状态模型

public enum NetworkState {
    CONNECTED,      // 网络已连接
    DISCONNECTED,   // 网络已断开
    CONNECTING,     // 网络连接中
    UNKNOWN         // 网络状态未知
}

5.2 AI模型状态模型

public enum AIModelState {
    INITIALIZED,    // 已初始化
    UNINITIALIZED,  // 未初始化
    INITIALIZING,   // 初始化中
    RELEASING       // 释放中
}

6. 流程设计

6.1 应用启动流程

graph TD
    A[应用启动] --> B[权限检查]
    B --> C{权限是否授予?}
    C -->|是| D[初始化网络状态管理器]
    C -->|否| E[请求权限]
    D --> F{网络是否可用?}
    F -->|是| G[初始化AI模型]
    F -->|否| H[注册网络监听器并等待]
    E --> C

网络状态监听器的启动应放在权限检查之后,确保应用具有必要的权限后再监听网络状态变化。

6.2 网络状态变化处理流程

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 权限要求

需要以下权限来检查网络状态:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

10.2 数据保护

  • 不收集或传输用户的网络使用数据
  • 网络状态信息仅在本地使用