Блок кода, выполняемый раньше, чем ожидалось, вместо логического - PullRequest
0 голосов
/ 26 февраля 2019

Я настраиваю экран дебетовой карты, на котором вы можете добавить свою дебетовую / кредитную карту к своей учетной записи.У меня все настроено хорошо, но моя проблема связана с проверкой, является ли ввод карты дубликатом.

Код работает, но часть, где карта добавляется в учетную запись, происходит раньшекарта помечена как дубликат, и я не уверен, почему это происходит.

Вот код, который вызывает мой метод 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 голосов
/ 26 февраля 2019

Похоже, проблема заключается в том, что вы проверяете наличие дубликатов в обратном вызове onDataChange

, для вызова которого требуется время.Тем временем, ваш if(!isDuplicate) вызывается и выполняется, поскольку onDataChange еще не изменилось isDuplicate на false.

В этом примере javascript есть похожая проблема, и рекомендуется сделать всю логику зависимой от обратного вызова внутри самого метода обратного вызова.В этом случае вам нужно будет переработать ваш код, чтобы поместить весь необходимый код внутри if(!isDuplicate) в ваш onDataChange(), найденный в checkDuplicate()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...