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" />
额外排查建议
- 先在浏览器/Postman里访问你的PHP接口,确认返回的JSON格式完全正确;
- 确保你的手机和运行PHP的服务器在同一局域网内,IP地址
192.168.43.5无误; - 可以在Android Studio的Logcat里查看具体崩溃日志,定位更细节的问题。
内容的提问来源于stack exchange,提问作者Moussa A M
相关产品推荐
相关产品推荐

