【问题背景】 原项目存在 4 处独立的 OkHttpClient 实例: 1. LoginActivity.kt:20 - private val client = OkHttpClient() 2. UpdateManager.kt:61 - val client = OkHttpClient() (检查更新) 3. UpdateManager.kt:142 - val client = OkHttpClient() (下载 APK) 4. LogManager.kt:20 - private val client = OkHttpClient() 5. AiChatRepository.kt - 独立 Builder().readTimeout(0, ms) 用于 SSE 每个 OkHttpClient 内部都创建独立的: - Dispatcher (默认最多 64 并发请求) - ConnectionPool (默认 5 个 keep-alive 连接) - 线程池 (同步/异步请求各一组) - 任务调度队列 【潜在问题】 1. 资源浪费: 5 个客户端 = 5 套连接池/线程池,空闲时仍占内存 2. 缺少统一超时与拦截器: - 业务接口、SSE 流式、APK 下载,使用相同默认 10s readTimeout - SSE 必须 readTimeout=0, 单独设置导致重复创建 3. 无法统一添加公共拦截器 (Token 注入、日志、Mock 等) 4. 单元测试与替换困难, 难以 mock 网络层 【修复方案】 新增 com.stand.standapp.net.NetworkModule (单例 object): 1. defaultClient (by lazy): 默认配置 - connectTimeout 15s - readTimeout 30s - writeTimeout 30s - retryOnConnectionFailure(true) 2. streamingClient(): 复用 defaultClient, 覆写 readTimeout=0 用于 SSE 3. 替换 5 处使用方: - LoginActivity → NetworkModule.defaultClient - UpdateManager (两处) → NetworkModule.defaultClient - LogManager → NetworkModule.defaultClient - AiChatRepository → NetworkModule.streamingClient() 【收益】 - 减少 4 个客户端实例 (内存占用降低约 100-200KB,依线程数) - 统一连接池上限 5 keep-alive, 避免系统 fd 浪费 - 为后续引入拦截器 (Token 注入/重试/日志) 铺平道路 - 代码可测试性提升, 通过 NetworkModule 可注入 mock client 【兼容性】 - 公共 API 不变 (OkHttpClient 接口) - 编译通过 (Java + Kotlin) - 业务行为不变 (超时/重试参数与原默认一致) 【影响范围】 - 新增: NetworkModule.kt - 修改: LoginActivity.kt, UpdateManager.kt, LogManager.kt, AiChatRepository.kt |
||
|---|---|---|
| .codegraph | ||
| .idea | ||
| app | ||
| gradle | ||
| key | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| img.png | ||
| img_1.png | ||
| settings.gradle.kts | ||