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

