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

Java Android如何读取数据库值初始化int变量避免重置为0

Android Firebase 胜/负场计数初始化修复方案

问题根因

变量在Activity创建时直接硬编码初始值为0,页面加载阶段没有主动拉取数据库存量数据覆盖初始值,导致每次进入页面计数都从0开始累加。
数据库存储结构参考:
Firebase实时数据库数据结构示例

修复步骤

  • 调整变量声明逻辑,保留0作为兜底默认值,在页面创建的生命周期节点提前拉取数据库数据完成变量初始化
  • 提前定义当前玩家对应的数据库节点引用,避免每次点击按钮重复获取引用
  • (可选优化)使用Firebase服务端原子自增能力替代原有「先读再写」逻辑,避免多端并发操作时出现计数覆盖错误

可直接复用的代码实现

1. 变量声明(类成员变量位置)

// 计数变量,默认0兜底,数据库拉取成功后自动覆盖
private int win_int = 0;
private int lose_int = 0;
// 数据库相关引用提前定义
private DatabaseReference database;
private DatabaseReference playerRef;
private String playerName;

2. 初始化逻辑(放在Activity的onCreate方法中,setContentView之后、绑定按钮事件之前执行)

// 初始化当前玩家对应的数据库节点
playerRef = database.getReference().child("players").child(playerName);

// 进入页面时拉取存量数据完成计数变量初始化
playerRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // 胜场读取,节点不存在时默认取0
        Integer winValue = dataSnapshot.child("wins").getValue(Integer.class);
        win_int = winValue != null ? winValue : 0;
        // 负场读取,节点不存在时默认取0
        Integer loseValue = dataSnapshot.child("loses").getValue(Integer.class);
        lose_int = loseValue != null ? loseValue : 0;

        // 如果要避免数据未加载完成时用户点击导致计数异常,可以在这里把两个按钮设为可点击状态
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(DuelGame.this, "初始化数据失败", Toast.LENGTH_SHORT).show();
    }
});

3. 优化后的按钮点击逻辑

Button win = (Button)findViewById(R.id.Poke);
win.setOnClickListener(v -> {
    // 服务端原子自增1,无需依赖本地变量值,避免并发计数错误
    playerRef.child("wins").setValue(ServerValue.increment(1))
            .addOnSuccessListener(unused -> {
                win_int++;
                Toast.makeText(DuelGame.this, "+1 win!", Toast.LENGTH_SHORT).show();
            })
            .addOnFailureListener(e -> {
                Toast.makeText(DuelGame.this, "Data error!", Toast.LENGTH_SHORT).show();
            });
});

Button lose = (Button)findViewById(R.id.lose_POKE);
lose.setOnClickListener(v -> {
    playerRef.child("loses").setValue(ServerValue.increment(1))
            .addOnSuccessListener(unused -> {
                lose_int++;
                Toast.makeText(DuelGame.this, "+1 Lose!", Toast.LENGTH_SHORT).show();
            })
            .addOnFailureListener(e -> {
                Toast.makeText(DuelGame.this, "Data error!", Toast.LENGTH_SHORT).show();
            });
});

补充说明

如果对计数准确性要求高,可以在初始化逻辑执行完成前,将两个胜负按钮设置为不可点击状态,等onDataChange回调拿到初始值后再恢复按钮可点击状态,避免极端场景下的计数偏差。

内容的提问来源于stack exchange,提问作者Biron al-Quppī

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:15:39