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

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,在项目中配置允许明文流量:
    1. 在res/xml目录下创建network_security_config.xml文件:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    
    1. 在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版本兼容问题,代码更简洁稳定:

  1. 在Module级别的build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
  1. 示例请求代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:01:03