Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 313|回复: 0

明文连接服务器获得返回值

[复制链接]

465

主题

640

帖子

3734

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3734
发表于 2025-11-30 15:11:12 | 显示全部楼层 |阅读模式
### 1. 报错原因简述  
测试用例期望回调返回结果,但实际为 `null`,导致断言失败。

---

### 2. 错误详细分析  

#### (1)核心错误信息:
```log
java.lang.AssertionError: 再次应用回调应该返回结果
```

该错误来自 JUnit 测试中的以下断言语句(位于 `LlmRecogTest.kt:131`):

```kotlin
assertNotNull(result)
```


说明程序预期某个异步操作完成后会通过回调传递一个非空的结果值,但实际上接收到的是 `null`。

#### (2)背景流程追踪:
从日志可以看出整个调用链如下:

- 调用了测试方法 `testDoBackgroundWorkWithCallbackByLambda`
- 启动了后台服务 `LlmBGService`
- 尝试进行文本翻译任务(ToTranslate)
- 使用 OpenAI SDK 发起网络请求(MyJavaOpenAIAPI)
- 请求过程中抛出异常:
  ```
  Caused by: java.net.UnknownServiceException: CLEARTEXT communication to x.x.x.x not permitted by network security policy
  ```


这表明由于 Android 的网络安全策略限制,无法发起明文 HTTP 请求到指定 IP 地址。

#### (3)根本问题定位:
因为网络请求失败,导致后续处理逻辑未执行或提前终止,最终未能将有效数据传回给回调函数,使得测试中获取的回调结果是 `null`。

---

### 3. 修复建议  

#### ✅ 解决方案一:允许 HTTP 明文通信(仅限调试)

修改 `res/xml/network_security_config.xml` 文件以允许对目标地址使用 HTTP:

```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">x.x.x.x</domain>
    </domain-config>
</network-security-config>
```


并在 [AndroidManifest.xml](file://C:\s_c\Android\vosk_renew_slim\app\src\main\AndroidManifest.xml) 中引用此配置文件:

```xml
<application
    android:networkSecurityConfig="@xml/network_security_config"
    ... >
</application>
```


⚠️ 注意:**生产环境中应避免开启明文传输,推荐改用 HTTPS 接口。**

---

#### ✅ 解决方案二:捕获并正确处理异常情况

确保即使发生网络异常也能通知上层回调机制,而不是静默失败。例如,在 [LlmBGService.java](file://C:\s_c\Android\vosk_renew_slim\app\src\main\java\cn\unicoder\myapplication\LlmBGService.java) 中增强异常处理逻辑:

```java
try {
    String result = myJavaOpenAIAPI.MyLlmDeal(inputText);
    callback.onSuccess(result); // 正常路径
} catch (Exception e) {
    Log.e("GithubOpenai", "error:", e);
    callback.onError(e.getMessage()); // 异常时也触发回调
}
```


同时更新你的测试代码来验证是否能正确接收错误信息:

```kotlin
// 示例伪代码(Kotlin)
val latch = CountDownLatch(1)
var result: String? = null

service.startTranslation("test") { res ->
    result = res
    latch.countDown()
}

latch.await()

// 可改为判断是否有错误消息而非直接 assertNotNull(result)
assertNotNull("Expected either success or error message", resultOrErrorMessage)
```


---

如需进一步排查其他警告类日志(如性能锁释放失败、线程优先级设置异常等),可提供更详细的上下文继续深入分析。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2026-2-4 12:02 , Processed in 0.011566 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表