Android Studio Java读取服务器文本文件报错问题排查
问题排查与解决
你的代码持续报错主要是以下几个常见原因,逐个排查解决:
1. 主线程执行网络请求(最可能的原因)
Android 3.0及以后禁止在UI主线程中执行网络操作,否则会抛出NetworkOnMainThreadException。如果你的代码是在Activity/Fragment的主线程里运行,必然触发这个异常。
解决方法:把网络请求放到子线程中执行,示例代码:
new Thread(new Runnable() { @Override public void run() { try{ URL url = new URL("https://www.robl.de/data/HS.txt"); URLConnection conn = url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; // 用Android的Log打印,替代System.out,在Logcat中查看结果 while ((inputLine = in.readLine()) != null) Log.d("NetworkContent", inputLine); in.close(); } catch (IOException e) { e.printStackTrace(); // 这里会打印具体错误,方便精准排查 } } }).start();
如果需要更新UI(比如把读取到的内容显示到TextView),必须回到主线程,可通过runOnUiThread()方法实现。
2. 明文HTTP流量被拦截
Android 9(API 28)及以上默认禁止明文HTTP请求,你代码中第二个请求用的是http://开头的链接,会被系统拦截,触发Cleartext HTTP traffic not permitted错误。
解决方法:
- 优先改用HTTPS链接(比如你第一个请求的
https://www.robl.de/data/HS.txt),更安全且无需额外配置; - 若必须使用HTTP,在项目中配置允许明文流量:
- 在
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" - 在
3. 权限配置验证
确认AndroidManifest.xml中已正确添加网络权限,该权限属于正常权限,无需动态申请:
<uses-permission android:name="android.permission.INTERNET" />
注意不要写错权限名称,且该标签要放在application标签之外。
4. TLS版本兼容问题(针对旧设备)
如果你的App需要兼容Android 4.4及以下版本,可能会出现HTTPS握手失败——旧系统默认不支持网站使用的高版本TLS协议。
解决方法:使用第三方网络库(如OkHttp),它会自动处理TLS版本兼容问题,代码更简洁稳定:
- 在Module级别的
build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
- 示例请求代码:
new Thread(new Runnable() { @Override public void run() { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://www.robl.de/data/HS.txt") .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("请求失败: " + response); String content = response.body().string(); Log.d("NetworkContent", content); // 回到主线程更新UI runOnUiThread(() -> { // 例如 textView.setText(content); }); } catch (IOException e) { e.printStackTrace(); } } }).start();
关键排查技巧
不要只看自己设置的"error"提示,查看Logcat中e.printStackTrace()输出的具体异常信息,能直接定位问题类型(比如主线程异常、SSL握手异常等)。
内容的提问来源于stack exchange,提问作者HermannGo
相关产品推荐
相关产品推荐

