首页 > 解决方案 > 参考硬币 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();
                                    }
                                });

                    }

标签: javaandroidfirebasefirebase-realtime-database

解决方案


您的代码中的问题在于您正在使用 addValueEventListener。这意味着您正在实时监听变化。每当你的数据库发生变化时,监听器就会触发。由于您正在侦听执行更新的同一位置,因此侦听器会一遍又一遍地触发。您需要的是 addListenerForSingleValueEvent,以只获取一次数据。

要解决这个问题,只需将调用更改为:

addValueEventListener()

至:

addListenerForSingleValueEvent()

您的代码将完美运行。


推荐阅读