【问题标题】:Firebase increment double do infinite loopFirebase 增量双做无限循环
【发布时间】:2018-02-19 22:13:59
【问题描述】:

我正在创建一个工作的方法,每次onComplete 完成时它都会增加一个值,但它会导致该字段上的无限循环。

例如当onComplete 结束时,该方法执行并且必须增加100 点,但它获取了点并且不断增加而没有结束。

这是我的方法:

@Override
public void afterTextChanged(Editable editable) {
                        refTrans.child(finalCurrentUserKey).child(Constants.FIRE_BASE_USER_DRIVER_PLUS).child("birthday").setValue(
                                etBirthday.getText().toString(), new DatabaseReference.CompletionListener() {
                                    @Override
                                    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                                        addPoints(finalCurrentUserKey);
                                    }
                                });
                    }

        private void addPoints(final String finalCurrentUserKey){
        // Create a reference to the DB
        final FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
        final DatabaseReference refPoints = mDatabase.getReference(Constants.FIRE_BASE_USER_DRIVER);
        final DatabaseReference scoreRef = refPoints.child(finalCurrentUserKey).child("score/increaseScore");

        //final Double[] count = new Double[1];
        final String operation = "increaseScore";

        scoreRef.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(MutableData mutableData) {
                Integer score = mutableData.getValue(Integer.class);
                if (score == null) {
                    return Transaction.success(mutableData);
                }

                if (operation.equals("increaseScore")) {
                    mutableData.setValue(score + 1);
                } /*else if (operation.equals("decreaseScore")){
                    mutableData.setValue(score - 1);
                }*/
                //mutableData.setValue(1);
                return Transaction.success(mutableData);
            }

            @Override
            public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {

            }
        });

【问题讨论】:

  • 如果你想在数据库中增加一个值,你应该考虑执行一个事务。如果有多个用户都试图同时写入同一个位置,那么您现在拥有它的方式可能会导致数据库中出现不正确的值。 firebase.google.com/docs/database/android/…
  • @DougStevenson 我已经完成了相同的交易结果!

标签: java android firebase firebase-realtime-database


【解决方案1】:

正如 Doug 在他的评论中提到的,对于这个用例,您应该使用事务。为此,我建议您绝对使用transactions。如果用户同时尝试增加/减少计数器,您将避免错误的结果。我已经解释了here如何使用事务来增加score,而不必担心在您的数据库中可能会出现不正确的值。

【讨论】:

  • 好的,我正在 .setValue(value, new DatabaseReference.CompletionListener() { public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { addPoints(finalCurrentUserKey);}}) 中执行该方法; 即使有事务,它也会创建无限循环
  • 您是否尝试过使用 post 中的确切代码?它将工作 100%。
  • 试过同样的问题,请查看初始帖子上的图片,孩子是黄色的并且不断增加而不是停止
  • 如果使用循环或者您调用方法的次数过多,则很可能会发生无限循环。为了解决这个问题,请仅使用我提供给您的简单代码并尝试查看它是否有效。是吗?
【解决方案2】:
    refPoints.child(finalCurrentUserKey).child("plusPoints").setValue(count[0]); 
// when this statement execute onDataChange method will be called every time

you should use 

    refPoints.child(finalCurrentUserKey).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

                  // do something

        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
}); 
    // this is going to call onDataChange method once if the value is changed or not

你应该检查this post

【讨论】:

  • 抱歉我不知道
【解决方案3】:

@Alex Mamo 感谢您的帮助,我在您的路上解决了我的问题并进行了一些验证,这就是我所做的,所以有一天它可以帮助任何人

                if (TextUtils.isEmpty(etBirthday.getText().toString())) {
                obtenerFechaApartir(actvty, etBirthday);
                addPoints(finalCurrentUserKey);
                etBirthday.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    }

                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    }

                    @Override
                    public void afterTextChanged(Editable editable) {
                        refTrans.child(finalCurrentUserKey).child(Constants.FIRE_BASE_USER_DRIVER_PLUS).child("birthday").setValue(
                                etBirthday.getText().toString(), new DatabaseReference.CompletionListener() {
                                    @Override
                                    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

                                    }
                                });
                    }
                });
            } else {
                obtenerFechaApartir(actvty, etBirthday);
                etBirthday.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    }

                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    }

                    @Override
                    public void afterTextChanged(Editable editable) {
                        refTrans.child(finalCurrentUserKey).child(Constants.FIRE_BASE_USER_DRIVER_PLUS).child("birthday").setValue(
                                etBirthday.getText().toString(), new DatabaseReference.CompletionListener() {
                                    @Override
                                    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

                                    }
                                });
                    }
                });
            }

看起来aftertextchanged创建了一个扣子,所以要小心那些家伙,问候!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2013-02-16
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多