Android项目重新打开Main Activity时变量被重置为0的问题求助
问题诊断与修复方案
看起来你的核心问题出在异步请求的处理逻辑、JSON解析不匹配,再加上几个容易忽略的细节,导致App里的变量始终停留在初始值0。咱们一步步拆解解决:
1. JSON解析不匹配:PHP返回单个对象,Java误用数组解析
你的PHP脚本最后输出的是单个JSON对象:echo json_encode($temp);,但Java的onResponse里却用JSONArray array = new JSONArray(response);去解析——这会直接抛出JSONException,而你的catch块直接吞了异常,导致后续的变量赋值代码根本没执行,变量自然保持初始的0值。
修复方法:把Java解析逻辑改成处理单个JSONObject,同时新增UI更新方法确保数据拿到后再刷新界面:
@Override public void onResponse(String response) { try{ // 替换JSONArray为JSONObject,匹配PHP返回的格式 JSONObject object = new JSONObject(response); gold = object.getInt("gold"); goldMultiplier = object.getInt("goldMulti"); xp = object.getInt("xp"); xpMultiplier = object.getInt("xpMulti"); xpMax = object.getInt("xpMax"); xpMaxMulti = object.getInt("xpMaxMulti"); dmg = object.getInt("dmg"); dmgMultiplier = object.getInt("dmgMulti"); bossCount = object.getInt("bossCount"); bossHP = object.getInt("bossHp"); bossHPMultiplier = object.getInt("bossHpMulti"); level = object.getInt("level"); backgroundCount = object.getInt("backgroundCount"); // 解析完成后统一更新UI updateGameUI(); }catch (JSONException e) { // 不要吞异常,打印出来方便排查 e.printStackTrace(); Toast.makeText(MainActivity.this, "数据解析出错: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } // 新增UI更新方法 private void updateGameUI() { levelText.setText("Level: " + Integer.toString(level)); goldText.setText("Gold: " + Integer.toString(gold)); bossHealthText.setText("HP: " + Integer.toString(bossHP)); bossNumberText.setText("Boss: " + bossCount); }
2. GET请求参数传递无效,PHP始终用硬编码的test用户
你在StringRequest里重写了getParams(),但GET请求不会把参数放到请求体里,而是需要拼在URL后面。更关键的是,你的PHP脚本里$username = "test"是固定值,根本没接收App传的LoggedInUser,这会导致你读的是test用户的数据(甚至test用户不存在时返回null,解析后变成0)。
修复方法:
第一步:修改PHP脚本,安全接收GET参数并修复SQL注入风险
<?php require "conn.php"; // 从GET参数获取用户名,默认 fallback 到test $username = isset($_GET['LoggedInUser']) ? $_GET['LoggedInUser'] : "test"; // 用预处理语句绑定参数,彻底避免SQL注入 $stmt = $conn->prepare("SELECT gold, goldMulti, xp, xpMulti, xpMax, xpMaxMulti, dmg, dmgMulti, bossCount, bossHp, bossHpMulti, level, backgroundCount FROM users WHERE username = ?"); $stmt->bind_param("s", $username); $stmt->execute(); $stmt->bind_result($gold, $goldMulti, $xp, $xpMulti, $xpMax, $xpMaxMulti, $dmg, $dmgMulti, $bossCount, $bossHp, $bossHpMulti, $level, $backgroundCount); $stmt->fetch(); $temp = array(); $temp['gold'] = $gold; $temp['goldMulti'] = $goldMulti; $temp['xp'] = $xp; $temp['xpMulti'] = $xpMulti; $temp['xpMax'] = $xpMax; $temp['xpMaxMulti'] = $xpMaxMulti; $temp['dmg'] = $dmg; $temp['dmgMulti'] = $dmgMulti; $temp['bossCount'] = $bossCount; $temp['bossHp'] = $bossHp; $temp['bossHpMulti'] = $bossHpMulti; $temp['level'] = $level; $temp['backgroundCount'] = $backgroundCount; echo json_encode($temp); // 记得关闭语句和连接 $stmt->close(); $conn->close(); ?>
第二步:修改Java的GET请求,把参数拼到URL后
private void getData(){ try { // 对用户名编码,避免特殊字符导致请求出错 String encodedUser = URLEncoder.encode(LoggedInUser, "UTF-8"); String urlWithParams = URL + "?LoggedInUser=" + encodedUser; StringRequest stringRequest = new StringRequest(Request.Method.GET, urlWithParams, new Response.Listener<String>() { // 这里是上面修改过的onResponse逻辑 }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); Toast.makeText(MainActivity.this, "请求失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); Volley.newRequestQueue(MainActivity.this).add(stringRequest); } catch (UnsupportedEncodingException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "用户名编码出错", Toast.LENGTH_SHORT).show(); } }
3. 异步请求时机问题:onStart里提前更新UI
你在onStart里调用getData()后马上执行levelText.setText(...),但网络请求是异步的——此时请求还没返回,变量还是初始的0值,所以会显示0。现在我们把UI更新放到updateGameUI()里,在解析完JSON后调用,就能确保用的是数据库返回的最新数据。
记得删掉onStart里这些提前更新UI的代码:
// 删掉这几行,交给updateGameUI处理 levelText.setText("Level: " + Integer.toString(level)); goldText.setText("Gold: " + Integer.toString(gold)); bossHealthText.setText("HP: " + Integer.toString(bossHP)); bossNumberText.setText("Boss: " + bossCount);
最后验证步骤
- 先在浏览器里测试修改后的PHP脚本:访问
http://jg1104.brighton.domains/AppPhp/variablesretrieval.php?LoggedInUser=你的测试用户名,确认返回正确的JSON对象。 - 运行App,检查是否能正确加载数据并更新UI,不再显示0值。
内容的提问来源于stack exchange,提问作者SnuffyWasTaken
相关产品推荐
相关产品推荐

