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
相关产品推荐
相关产品推荐

