You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Thread任务未执行:服务器检测代码为何无日志输出?

问题原因及修正方案

1. 子线程异常未捕获导致日志丢失

你的run()方法捕获IOException后直接抛出RuntimeException,但子线程中未处理的异常会直接终止线程,且不会自动输出到Logcat。你误以为代码被跳过,实际是异常抛出后线程直接结束,没执行到Log.d语句。

修正:在catch块中添加日志输出,避免直接抛出异常终止线程:

catch (IOException e) {
    Log.e("test", "连接失败: " + e.getMessage());
}

2. 缺少网络权限

Android应用访问网络必须在AndroidManifest.xml中声明INTERNET权限,否则会触发权限异常导致连接失败:

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

3. Android 9+明文HTTP限制

如果你的server-address是HTTP协议(非HTTPS),Android 9及以上默认禁止明文网络请求,会直接导致连接失败。解决方式二选一:

  • 将服务器地址替换为HTTPS协议
  • 在res/xml目录创建network_security_config.xml,允许明文请求:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在AndroidManifest.xml的application标签中引用该配置:

android:networkSecurityConfig="@xml/network_security_config"

4. URL连接配置缺失

默认的HttpsURLConnection未设置超时时间,可能导致线程长时间阻塞;建议显式配置超时和请求方法:

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
// 设置5秒连接超时和读取超时
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
// 显式设置GET请求方法
urlConnection.setRequestMethod("GET");
int code = urlConnection.getResponseCode();

5. URL初始化的潜在风险

你直接在成员变量位置初始化URL,构造函数仅声明抛出异常但未处理。如果server-address格式错误,创建CheckServer实例时就会抛出MalformedURLException,导致线程根本无法启动。建议将初始化逻辑移到构造函数内:

public class CheckServer extends Thread {
    private URL url;

    public CheckServer(String serverUrl) throws MalformedURLException {
        this.url = new URL(serverUrl);
    }

    // ... run方法不变
}

内容的提问来源于stack exchange,提问作者carl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:09:57