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

Android Studio从API获取Json崩溃求助:构建URL传入方法时出错

Hey there! 作为刚接触Android Studio和Java的新手,遇到网络请求崩溃太正常啦——咱们一步步来排查问题,先从最常见的几个坑说起:

第一步:检查网络权限是否配置

Android App要访问网络,必须在AndroidManifest.xml里声明权限,不然直接会因为无权限崩溃。赶紧把这两行加进去:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 可选,但方便提前判断网络状态 -->
第二步:绝对不能在主线程做网络请求

Android从API 11开始就禁止在UI主线程执行网络操作了,直接调用会抛出NetworkOnMainThreadException导致崩溃。你得用异步方式处理,比如入门友好的AsyncTask:

// 定义异步任务类
private class FetchJsonTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        // 这里在后台线程执行网络请求,调用你的getResponseFromHttpURL方法
        return getResponseFromHttpURL(urls[0]);
    }

    @Override
    protected void onPostExecute(String jsonResult) {
        // 这里回到主线程,处理返回的JSON数据、更新UI
        if (jsonResult != null) {
            // 解析JSON的逻辑写在这里
        }
    }
}

// 调用的时候这么写,把你构建好的URL传进去
new FetchJsonTask().execute(yourBuiltUrl);
第三步:排查URL构建是否合法

崩溃可能是URL格式错误导致的——比如有空格、特殊字符没转义,或者API地址拼写错了。你可以先把构建好的URL打印出来,复制到浏览器里试试能不能正常返回JSON:

String builtUrl = "你的构建结果";
Log.d("URL_CHECK", "当前使用的URL: " + builtUrl);

如果浏览器都打不开,那就是URL本身的问题,先修正地址。

第四步:给网络请求方法加上完整的异常处理

你的getResponseFromHttpURL方法大概率没处理各种网络异常(比如连接超时、IO失败),这些都会直接导致崩溃。给它套上try-catch并关闭资源:

private String getResponseFromHttpURL(String urlString) {
    String jsonResponse = null;
    HttpURLConnection connection = null;
    InputStream inputStream = null;

    try {
        URL url = new URL(urlString);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setConnectTimeout(5000); // 设置5秒连接超时
        connection.setReadTimeout(5000);

        inputStream = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        jsonResponse = sb.toString();
    } catch (MalformedURLException e) {
        Log.e("NETWORK_ERROR", "URL格式错误", e);
    } catch (IOException e) {
        Log.e("NETWORK_ERROR", "网络IO异常", e);
    } finally {
        // 一定要关闭资源,避免内存泄漏
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            connection.disconnect();
        }
    }
    return jsonResponse;
}

这样即使出问题,也会打印错误日志,而不是直接崩溃,方便你定位问题。

第五步:查看Logcat崩溃日志

这是最关键的一步!崩溃时打开Android Studio底部的Logcat,过滤Error级别,找到崩溃的堆栈信息——比如是NetworkOnMainThreadException(主线程网络请求)、MalformedURLException(URL错误)还是NullPointerException(空指针),根据日志就能精准解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:59:58