我正在设置一个借记卡屏幕,您可以在其中将借记卡/信用卡添加到您的帐户中。我把它设置得很好,但我的问题是要检查卡的输入是否重复。
该代码正在运行,但是将卡添加到帐户的部分是在将该卡标记为重复卡之前发生的,我不确定为什么会这样。
这是调用我的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())
代码在标记重复项之前发生。
为什么会这样?
答案 0 :(得分:2)
问题似乎是您正在检查回调onDataChange
中的重复项
需要花费一些时间才能被致电。同时,您的
由于if(!isDuplicate)
尚未将onDataChange
更改为isDuplicate
,因此调用并执行了false
。
This Javascript示例有一个类似的问题,建议您执行所有依赖于回调方法本身内的回调的逻辑。在这种情况下,您需要重新编写代码,将if(!isDuplicate)
中的所有必要代码放入onDataChange()
checkDuplicate()
中