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

Android中独立线程执行HTTP请求仍崩溃,请求协助

嘿,我来帮你看看问题出在哪~

问题分析与解决方案

你的代码里有几个关键问题导致网络请求失败,我们一步步来解决:

1. 缺少网络权限声明

这是Android新手最容易踩的坑!Android系统要求应用如果要访问网络,必须在AndroidManifest.xml中声明网络权限。你当前的代码没有添加这个权限,直接导致网络请求被系统拦截。

解决方法:
打开你的AndroidManifest.xml文件,在<application>标签的外部添加这行代码:

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

2. 异常捕获太笼统,无法定位具体错误

你现在的catch块只打印了"Error occured!",完全看不到真实的错误原因(比如网络连接失败?URL格式错误?还是IO异常?),这让排查问题变得非常困难。

解决方法:
修改catch块的代码,打印完整的异常栈信息:

catch (Exception e) {
    Log.e("TAG", "下载出错了", e); // 会输出详细的错误链路,帮你精准定位问题
}

3. content变量未初始化,会导致字符串拼接异常

你声明了String content;但没有初始化,默认值是null,执行content += str;时会变成null拼接字符串,结果会是nullxxxxxx,这既不是你想要的内容,还可能引发其他潜在问题。

解决方法:
初始化content为空字符串:

String content = "";

可选优化:用更简洁的方式更新UI(非必须,但代码更清爽)

你用Handler在主线程打印日志是可行的,但Android提供了更简洁的runOnUiThread方法,可以替代Handler,让代码更易读:
在子线程的run方法里,获取到content后直接调用:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", content);
    }
});

修改后的完整代码

整合了所有修复点的代码如下:

package com.dan6erbond.schoolhelper;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private String link = "https://dan6erbond.github.io/I1A/Documents/Zusammenfassungen/Zusammenfassungen.json";
    String content = ""; // 初始化content为空字符串

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread downloadFile = new Thread(new Runnable(){
            @Override
            public void run(){
                try {
                    URL url = new URL(link);
                    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
                    String str;
                    while ((str = in.readLine()) != null) {
                        content += str;
                    }
                    // 用runOnUiThread在主线程打印日志
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i("TAG", content);
                        }
                    });
                    in.close();
                } catch (Exception e) {
                    Log.e("TAG", "下载出错了", e); // 打印详细异常信息
                }
            }
        });
        downloadFile.start();
    }
}

记得一定要在AndroidManifest.xml中添加网络权限!按照这些步骤修改后,你的应用应该就能正常读取在线文件并打印内容了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:22:19