如何改写XP升级逻辑?实现每50XP仅调用一次Level_Counter方法
优化XP等级提升逻辑,避免重复代码
这个问题很典型,硬编码固定XP阈值会导致代码冗余,后续调整阈值或者扩展更高等级时会非常麻烦。我们可以通过数学运算+简单状态记录来实现每累计50XP自动提升等级,只需要调用一次升级方法:
改写后的代码
private void Levels(){ ref.child(userID).child("XP").addValueEventListener(new ValueEventListener() { // 记录上一次处理过的XP,避免重复触发等级提升 private Integer lastProcessedXp = 0; @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { Integer current_xp = dataSnapshot.getValue(Integer.class); // 校验XP有效性,同时判断是否达到50的整数倍,且是未处理过的新阈值 if (current_xp != null && current_xp % 50 == 0 && current_xp > lastProcessedXp) { Level_Counter level_counter = new Level_Counter(userID); level_counter.Counter(); // 更新已处理的XP值,防止重复触发 lastProcessedXp = current_xp; } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 补充异常处理,避免忽略读取数据失败的情况 Log.e("XPLevelHandler", "Failed to fetch XP data", databaseError.toException()); } }); }
关键优化点说明
- 动态判断阈值:用
current_xp % 50 == 0替代硬编码的数值,不管是50、100、150还是更高的50倍数XP,都能自动触发等级提升,后续调整阈值(比如改成每100XP升级)只需要修改这个数字即可 - 避免重复触发:添加
lastProcessedXp变量记录已处理过的XP值,防止Firebase数据更新时(比如XP被重新设置)重复调用升级方法 - 空值安全:增加
current_xp != null的判断,避免Firebase返回null时出现NullPointerException - 完善异常处理:补充
onCancelled方法的实现,方便排查数据读取失败的问题
如果你的Level_Counter.Counter()方法还需要知道当前对应的等级,还可以直接通过current_xp / 50计算等级(比如50XP对应1级,100XP对应2级),把等级作为参数传递进去,进一步提升方法的灵活性。
内容的提问来源于stack exchange,提问作者markharrop
相关产品推荐
相关产品推荐

