我试图根据数据库中的值条件在 addValueEventListener 中执行一些代码,但是当数据更改时,监听器根据旧数据执行条件,并在第二次尝试监听器执行我想要使用的数据。但是数据更改监听器执行listener(-1)数据。更清楚地说,如果存在“禁用”或“停止”子项,我不想执行代码,但是在更新数据并且这些子项不存在之后,我调用 AddMessage 方法时的条件不再执行,但它执行方法当我第二次调用时,它会正确执行,直到下次更新数据为止,它会再次出现相同的问题。
sendMessage.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
AddMessage();
}
});
private void AddMessage() {
nListener = RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
if (!dataSnapshot.hasChild("disable") && !dataSnapshot.hasChild("stop")) {
HashMap <String,String> chatMessageMap = new HashMap <>();
chatMessageMap.put("from", messageSenderID);
chatMessageMap.put("type", "check");
chatMessageMap.put("content", messageText);
MessagesRef.child(messageReceiverID).push().setValue(chatMessageMap);
RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).removeEventListener(nListener);
} else {
RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).removeEventListener(nListener);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
最佳答案
sendMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String stoppedUser;
myDbref = FirebaseDatabase.getInstance().getReference().child("List Ref").child(<UID_OF_RECEIVER_OF_MESSAGE>);
myDbref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
stoppedUser = dataSnapshot.child(<UID_OF_SENDER>).child("stop").getValue().toString();
//Now use if-else statement
if(<UID_OF_RECEIVER> == stoppedUser){
Toast.makeText(getApplicationContext(), "You are blocked.", Toast.LENGTH_LONG).show();
} else {
AddMessage();
}
}catch (Throwable e){
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
虽然你可以获得<UID_OF_SENDER>
通过使用FirebaseUser currentUserUID = FirebaseAuth.getInstance().getCurrentUser();
确保输入 <UID_OF_RECEIVER>
的值正确,并根据需要更正数据库路径。
关于java - 当数据更改时,Firebase 不会检索最后的数据,并且不会以正确的方式执行 addValueEventListener 内的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61288719/