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

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);

最后验证步骤

  1. 先在浏览器里测试修改后的PHP脚本:访问http://jg1104.brighton.domains/AppPhp/variablesretrieval.php?LoggedInUser=你的测试用户名,确认返回正确的JSON对象。
  2. 运行App,检查是否能正确加载数据并更新UI,不再显示0值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:02:45