Java Android studio/Firebase-尝试获取数据时遇到无限循环
我试图从我的firebaseDB中获取数据,但它一直在无限地运行,我不明白为什么 问题是:用户键入一封要寄钱的邮件。我从数据库中取出所有用户,并将书面电子邮件与每个用户的电子邮件进行比较。如果电子邮件与某个用户匹配(电子邮件是唯一的),则会在内部发出另一个db呼叫,以获得收件人的余额。用户的余额会更新,收件人的余额也会更新。 问题是,它不断地减去发送者的金额,而无限地(通过单击一次)增加接收者的金额 我知道这与异步执行有关,但我对编程太陌生,不知道如何解决它 有人能帮忙吗?代码如下:Java Android studio/Firebase-尝试获取数据时遇到无限循环,java,android,firebase,firebase-authentication,Java,Android,Firebase,Firebase Authentication,我试图从我的firebaseDB中获取数据,但它一直在无限地运行,我不明白为什么 问题是:用户键入一封要寄钱的邮件。我从数据库中取出所有用户,并将书面电子邮件与每个用户的电子邮件进行比较。如果电子邮件与某个用户匹配(电子邮件是唯一的),则会在内部发出另一个db呼叫,以获得收件人的余额。用户的余额会更新,收件人的余额也会更新。 问题是,它不断地减去发送者的金额,而无限地(通过单击一次)增加接收者的金额 我知道这与异步执行有关,但我对编程太陌生,不知道如何解决它 有人能帮忙吗?代码如下: p
public void sendTo(){
final String receiverEmail = editTextReciever.getText().toString().trim();
String amountHolder = ediTextAmount.getText().toString().trim();
if(TextUtils.isEmpty(receiverEmail)){
Toast.makeText(getApplicationContext(), "Enter an email", Toast.LENGTH_LONG).show();
return;
}
if(TextUtils.isEmpty(amountHolder)){
Toast.makeText(getApplicationContext(), "Enter an amount to send", Toast.LENGTH_LONG).show();
return;
}
//If it has gotten this far, theres data in the editText (the editText can only contain numbers)
final int amount = Integer.parseInt(amountHolder);
//Looping through every user in the DB and checking if the typed email belong to any of the users in the DB
FirebaseDatabase.getInstance().getReference("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
User user = snapshot.getValue(User.class);
//If typed email matches a user in the db (emails are unique due to firebaseAuthentication), continue
if(user.getEmail().equals(receiverEmail)){
recipientUid = snapshot.getKey();
if(accountBalance - amount >= 0 && uid != snapshot.getKey()){
//I have to fetch our the balance of the user i'm sending money to so I can add the amount to his balance
FirebaseDatabase.getInstance().getReference("Accounts/" + accountType).child(snapshot.getKey()).child("balance").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int balanceOfReceiver = Integer.parseInt(dataSnapshot.getValue().toString());
int updatedBalance = balanceOfReceiver + amount;
//The senders balance is updated
accountBalance = accountBalance - amount;
FirebaseDatabase.getInstance().getReference("Accounts/" + accountType).child(uid).child("balance").setValue(accountBalance);
//And the recipients balance is updated
FirebaseDatabase.getInstance().getReference("Accounts/" + accountType).child(recipientUid).child("balance").setValue(updatedBalance);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
Toast.makeText(getApplicationContext(), "You can't overdraw or send money to yourself", Toast.LENGTH_LONG).show();
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
将ValueEventListener添加到users ref,当数据发生更改时,将调用onDataChange。 你减去钱的数额,再触发onDataChange,你就进入了一个循环 在更改金额之前,您需要重新考虑代码结构或删除侦听器 这个 触发这个
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
看起来每次调用
sendTo()
时,它都会附加一个ValueEventListener
。这是你应该做一次的事。所以每次调用sendTo()
时,它都会向列表中添加一个新的侦听器。这可能会导致一些重复。更新数据库后,如何关闭侦听器?谢谢你的帮助我想他是说你根本不需要听众来更新这些值。监听器正在进行更改,这会触发监听器,而监听器会进行更改,这…永远。没错,我看不出您需要第二个监听器的原因,这就是为什么我建议您考虑一种更好的方法来构建您的代码。。您可以像这样删除侦听器:dbRef.removeEventListener(valueEventListener);我改用addListenerForSingleValueEvent,这使它工作正常。谢谢你们两个!
public void onDataChange(@NonNull DataSnapshot dataSnapshot)