在预期之前代替布尔值之前执行的代码块

时间:2019-02-26 17:41:42

标签: java firebase-realtime-database

我正在设置一个借记卡屏幕,您可以在其中将借记卡/信用卡添加到您的帐户中。我把它设置得很好,但我的问题是要检查卡的输入是否重复。

该代码正在运行,但是将卡添加到帐户的部分是在将该卡标记为重复卡之前发生的,我不确定为什么会这样。

这是调用我的checkDuplicate()方法的代码,然后在一切正常的情况下继续将卡添加到帐户中

        buy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            checkDuplicates(cardForm.getCardNumber());
            if(!isDuplicate) {
            if (cardForm.isValid()) {
                alertBuilder = new AlertDialog.Builder(AddDebits.this);
                alertBuilder.setTitle("Please ensure your card information is correct");
                alertBuilder.setMessage("Card number: " + cardForm.getCardNumber() + "\n" +
                        "Card expiry date: " + cardForm.getExpirationDateEditText().getText().toString() + "\n" +
                        "Card CVV: " + cardForm.getCvv() + "\n" +
                        "Postal code: " + cardForm.getPostalCode() + "\n" +
                        "Name: " + cardForm.getCardholderName());
                alertBuilder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        final CreateCard newCard = new CreateCard(cardForm.getCardholderName(), cardForm.getCardNumber(),
                                cardForm.getExpirationDateEditText().getText().toString(), cardForm.getCvv(), cardForm.getPostalCode());

                        amountOfCards(new AmountOfCardsCallback() {
                            @Override
                            public void onCallback(long amount, long defaultCard) {
                                userRef.child("amountOfCards").setValue(++amount);
                                userRef.child("Card" + amount).setValue(newCard);
                            }
                        });

                        dialogInterface.dismiss();
                        Toast.makeText(AddDebits.this, "Your card has been added to your account", Toast.LENGTH_LONG).show();
                    }
                });
                alertBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                });

我最关注的代码片段是前几行

    public void onClick(View view) {
    checkDuplicates(cardForm.getCardNumber());
    if(!isDuplicate) {
    if (cardForm.isValid()) {

checkDuplicate()方法如下所示

    private void checkDuplicates(final String cardNumber)
{
    userRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(final DataSnapshot dataSnapshot) {
            amountOfCards(new AmountOfCardsCallback() {
                @Override
                public void onCallback(long amount, long defaultCard) {
                    for(int i = 0; i < amount; i++) {
                        if (dataSnapshot.child("Card" + i).child("cardNumber").getValue() != null) {
                            if (dataSnapshot.child("Card" + i).child("cardNumber").getValue().toString().equals(cardNumber)) {
                                isDuplicate = true;
                                alertBuilder.setTitle("Duplicate Card")
                                        .setMessage("You already have this card saved");
                                alertBuilder.show();

                                alertBuilder.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {

                                    }

                                });

                            }
                        }
                    }
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

此方法功能完好。发生重复时,它将查找重复项并显示一个对话框。但是问题在于,直到将卡添加到帐户后,它才会发生。

因此if(cardForm.isValid())代码在标记重复项之前发生。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

问题似乎是您正在检查回调onDataChange中的重复项

需要花费一些时间才能被致电。同时,您的 由于if(!isDuplicate)尚未将onDataChange更改为isDuplicate,因此调用并执行了false

This Javascript示例有一个类似的问题,建议您执行所有依赖于回调方法本身内的回调的逻辑。在这种情况下,您需要重新编写代码,将if(!isDuplicate)中的所有必要代码放入onDataChange()

中的checkDuplicate()