java - 参考硬币 Firebase 数据库将硬币翻倍,直到应用崩溃
问题描述
我在我的应用程序中添加了推荐硬币系统,如果您将其推荐给某人,您将获得 100 个硬币,并且该人引用您使用的代码相同。但是问题是当我运行应用程序并使用推荐代码时,除非应用程序崩溃,否则硬币会不断增加。硬币应该在两个帐户中添加 100,但它们会从 0 增加到 24000 或更多,除非应用程序崩溃。
以下代码是:
reference
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
ProfileModel model = snapshot.child(oppositeUID).getValue(ProfileModel.class);
ProfileModel myModel = snapshot.child(user.getUid()).getValue(ProfileModel.class);
int coins = model.getCoins();
int updatedCoins = coins + 100;
int myCoins = myModel.getCoins();
int myUpdate = myCoins + 100;
HashMap<String, Object> map = new HashMap<>();
map.put("coins", updatedCoins);
HashMap<String, Object> myMap = new HashMap<>();
myMap.put("coins", myUpdate);
reference.child(oppositeUID).updateChildren(map);
reference.child(user.getUid()).updateChildren(myMap)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
dialog.dismiss();
Toast.makeText(InviteActivity.this, "Congrats", Toast.LENGTH_SHORT).show();
}
});
}
解决方案
您的代码中的问题在于您正在使用 addValueEventListener。这意味着您正在实时监听变化。每当你的数据库发生变化时,监听器就会触发。由于您正在侦听执行更新的同一位置,因此侦听器会一遍又一遍地触发。您需要的是 addListenerForSingleValueEvent,以只获取一次数据。
要解决这个问题,只需将调用更改为:
addValueEventListener()
至:
addListenerForSingleValueEvent()
您的代码将完美运行。
推荐阅读
- django - 如何从一个国家/地区获取城市列表,该国家/地区在 Django 中知道该国家/地区的一个城市
- types - Ocaml 类型中的 Int 的 Int
- python - 如何使用 python 从 SQL Server 检索时间戳?
- javascript - Braintree/Javascript: How do I get access to previous customer's billing address?
- c# - 向用户显示建议并获得输入
- javascript - 桶排序 JavaScript
- javascript - 将这些常见的断言保存在单独的文件中而不重复它是一个好主意吗?
- node.js - JSONSerialization 生成不正确的 JSON 对象。迅速
- swift - 使用 CoreML 从模式预测结果
- ssh - 需要帮助“服务器发送断开连接消息类型 11(由应用程序)“用户身份验证超时””