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

Android Studio(Kotlin)从MySQL表填充Spinner控件时应用崩溃问题求助

解决Spinner填充MySQL数据时应用崩溃的问题

我帮你排查了代码里的几个关键问题,这些都是导致应用崩溃的常见原因,下面逐个给出修复方案:

主要问题分析

  • 循环内重复创建Adapter:你在for循环的每一次迭代里都重新创建ArrayAdapter并绑定到Spinner,这不仅完全没必要,还会导致UI线程频繁更新引发异常。
  • 错误回调写法错误:Response.ErrorListener的实现方式不对,你在回调内部又定义了一个onErrorResponse函数,这会让Volley无法正确处理错误回调,直接引发崩溃。
  • PHP错误返回非JSON格式:当数据库查询失败时,你返回的是普通文本而非合法JSON,Volley的JsonObjectRequest解析失败后就会抛出异常导致应用崩溃。
  • 大概率缺少网络权限:如果你的AndroidManifest.xml里没加INTERNET权限,应用连网络都访问不了,必然崩溃。

修复后的完整代码

1. 修正Kotlin代码

spinner_bac = findViewById(R.id.spinner_bac)
val url = "http://192.168.43.5/android/remplissage_bac.php"
val rq: RequestQueue = Volley.newRequestQueue(this)
// 确保列表是初始化好的可变列表
val listeBacc = mutableListOf<String>()

val jor = JsonObjectRequest(Request.Method.GET, url, null,
    Response.Listener { response ->
        val jsonArray = response.getJSONArray("bacc")
        // 注意:遍历的是JSON数组的长度,不是response的长度
        for(i in 0 until jsonArray.length()) {
            val jsonObject = jsonArray.getJSONObject(i)
            val nomBacc = jsonObject.getString("label_bacc")
            listeBacc.add(nomBacc)
        }
        // 所有数据添加完成后,再创建Adapter并绑定到Spinner
        baccAdapter = ArrayAdapter(
            this@MainActivity,
            android.R.layout.simple_spinner_item, // 推荐用Spinner专用的布局
            listeBacc
        )
        baccAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        spinner_bac.adapter = baccAdapter
    },
    Response.ErrorListener { error ->
        // 直接实现错误处理逻辑,不要嵌套定义函数
        error.printStackTrace()
        // 给用户友好提示
        Toast.makeText(this@MainActivity, "加载失败:${error.message}", Toast.LENGTH_SHORT).show()
    })
rq.add(jor)

2. 修正PHP代码(保证始终返回JSON)

<?php
require_once "connexion.php";
// 初始化统一返回数组
$return_arr = array();

$sql = "select * from bacc";
$resultat = $conn->query($sql);

if (!$resultat) {
    // 查询失败时返回带错误信息的JSON
    $return_arr['error'] = "数据库查询错误: " . $conn->error;
} else {
    if ($resultat->num_rows > 0) {
        $return_arr['bacc'] = array();
        while ($row = $resultat->fetch_array()) {
            array_push($return_arr['bacc'], array(
                'bacc_id' => $row['bacc_id'],
                'label_bacc' => $row['label_bacc']
            ));
        }
    } else {
        // 无数据时也返回合法JSON
        $return_arr['bacc'] = array();
        $return_arr['message'] = "未找到任何数据";
    }
}

// 设置正确的响应头,确保返回JSON格式
header('Content-Type: application/json');
echo json_encode($return_arr);
?>

3. 补充网络权限

在AndroidManifest.xml的<manifest>标签内添加:

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

额外排查建议

  1. 先在浏览器/Postman里访问你的PHP接口,确认返回的JSON格式完全正确;
  2. 确保你的手机和运行PHP的服务器在同一局域网内,IP地址192.168.43.5无误;
  3. 可以在Android Studio的Logcat里查看具体崩溃日志,定位更细节的问题。

内容的提问来源于stack exchange,提问作者Moussa A M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:32:46