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

Android Studio中从无名称JSON数组的API获取数据时应用崩溃

Android 联网崩溃(无名称JSON数组解析场景)

以下是针对该场景的核心排查与解决方案:

1. 检查网络权限配置

确认AndroidManifest.xml中已添加网络权限,缺失会直接导致联网失败崩溃:

<uses-permission android:name="android.permission.INTERNET" />
<!-- Android 10+ 如需判断网络状态可添加,非强制要求 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2. 禁止主线程执行网络请求

Android 3.0+ 严格禁止在主线程发起网络请求,否则会抛出NetworkOnMainThreadException导致崩溃,必须用异步方式处理:

  • Kotlin 协程实现(推荐):
// 在Activity/Fragment中使用lifecycleScope
lifecycleScope.launch(Dispatchers.IO) {
    // 后台线程执行网络请求
    val jsonString = fetchJsonFromApi()
    // 切回主线程更新UI
    withContext(Dispatchers.Main) {
        if (!jsonString.isNullOrEmpty()) {
            parseAndShowData(jsonString)
        }
    }
}

// 网络请求函数示例
private suspend fun fetchJsonFromApi(): String? {
    return try {
        val url = URL("你的API地址")
        val connection = url.openConnection() as HttpURLConnection
        connection.connectTimeout = 5000
        if (connection.responseCode == HttpURLConnection.HTTP_OK) {
            connection.inputStream.bufferedReader().use { it.readText() }
        } else {
            null
        }
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}
  • Java AsyncTask 实现:
new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(Void... voids) {
        // 执行网络请求
        try {
            URL url = new URL("你的API地址");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                return new BufferedReader(new InputStreamReader(connection.getInputStream()))
                        .lines().collect(Collectors.joining());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String jsonString) {
        super.onPostExecute(jsonString);
        // 主线程解析并更新UI
        if (jsonString != null) {
            parseAndShowData(jsonString);
        }
    }
}.execute();

3. 修正无名称JSON数组的解析逻辑

API返回的是无名称JSON数组(如[{"field":"value"},...]),不能先尝试解析为JSONObject,否则会抛出JSONException:

  • Kotlin 解析示例:
private fun parseAndShowData(jsonString: String) {
    try {
        val jsonArray = JSONArray(jsonString)
        val sb = StringBuilder()
        for (i in 0 until jsonArray.length()) {
            val itemObj = jsonArray.getJSONObject(i)
            // 替换为你的目标字段名
            val content = itemObj.getString("target_field")
            sb.append(content).append("\n")
        }
        yourTextView.text = sb.toString()
    } catch (e: JSONException) {
        e.printStackTrace()
        yourTextView.text = "解析失败"
    }
}
  • Java 解析示例:
private void parseAndShowData(String jsonString) {
    try {
        JSONArray jsonArray = new JSONArray(jsonString);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject itemObj = jsonArray.getJSONObject(i);
            String content = itemObj.getString("target_field");
            sb.append(content).append("\n");
        }
        yourTextView.setText(sb.toString());
    } catch (JSONException e) {
        e.printStackTrace();
        yourTextView.setText("解析失败");
    }
}

4. 关键崩溃日志排查

打开Android Studio的Logcat,筛选Error级别日志,找到Caused by开头的异常信息,精准定位问题:

  • NetworkOnMainThreadException:主线程联网问题
  • JSONException:JSON格式不匹配或目标字段不存在
  • SecurityException:网络权限未配置
  • NullPointerException:TextView未初始化或JSON数据为空

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:50:21