Android 为什么添加值时不会触发这些ValueEventListeners?
代码如下所示:Android 为什么添加值时不会触发这些ValueEventListeners?,android,firebase,firebase-realtime-database,event-listener,Android,Firebase,Firebase Realtime Database,Event Listener,代码如下所示: msgRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot1) { ms = dataSnapshot1.getValue(String.class); flag1++; Log.i("flag1", String.valueO
msgRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
ms = dataSnapshot1.getValue(String.class);
flag1++;
Log.i("flag1", String.valueOf(flag1));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
FuidRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
fUid = dataSnapshot2.getValue(String.class);
flag2++;
Log.i("flag2", String.valueOf(flag2));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
secretRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
st = dataSnapshot3.getValue(String.class);
flag3++;
Log.i("flag3", String.valueOf(flag3));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
final DatabaseReference TuidRef=usersRef.child(td);
最终数据库参考msgRef=TuidRef.child(“rec_msg”);
最终数据库引用FuidRef=TuidRef.child(“fromUID”);
最终数据库引用secretRef=TuidRef.child(“rec_secret”);
msgRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(@NonNull DataSnapshot dataSnapshot1){
ms=dataSnapshot1.getValue(String.class);
flag++;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
FuidRef.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot dataSnapshot2){
fUid=dataSnapshot2.getValue(String.class);
flag++;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
secretRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(@NonNull DataSnapshot dataSnapshot3){
st=dataSnapshot3.getValue(String.class);
flag++;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
字符串flagS=“”+标志;
Log.i(“旗帜”,旗帜);
如果(标志>2)
displayMessage();
我使用该标志来了解触发ValueEventListeners
的次数,但在日志中发现该标志为0
td
是接收消息的人的uid
。在下图中,它与其他兄弟子女的父密钥相同
当没有消息时,数据库看起来像这样:
收到消息时,数据库如下所示:
编辑:当三个侦听器同时被触发时,如何执行函数displayMessage()
但是,该值会同时添加到firebase数据库中的所有三个值。您永远不会知道一个
ValueEventListeners
以do的方式触发了多少次,因为标志的值将始终保持0
。发生这种情况的原因是onDataChange()
方法的异步行为,甚至在您试图从数据库获取数据之前就调用了该方法。实际情况是,您试图从数据库中获取数据并立即尝试记录它,而标志
变量的初始值为0
。然后,当从数据库获取数据完成时,它会更改标志的值,但不再读取
此问题的快速解决方法是在每个回调中添加三个不同的标志,然后尝试在onDataChange()
方法中单独记录,如下所示:
msgRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
ms = dataSnapshot1.getValue(String.class);
flag1++;
Log.i("flag1", String.valueOf(flag1));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
FuidRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
fUid = dataSnapshot2.getValue(String.class);
flag2++;
Log.i("flag2", String.valueOf(flag2));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
secretRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
st = dataSnapshot3.getValue(String.class);
flag3++;
Log.i("flag3", String.valueOf(flag3));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
如果您需要在代码中获取onDataChange()
方法之外的该标志的值,我建议您查看此中anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成该操作。您还可以查看此,以便更好地理解
编辑:
msgRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
ms = dataSnapshot1.getValue(String.class);
flag++;
FuidRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
fUid = dataSnapshot2.getValue(String.class);
flag++;
secretRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
st = dataSnapshot3.getValue(String.class);
flag++;
Log.i("flag", String.valueOf(flag));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
这是否意味着永远不会执行displayMessage()
?我想在这三个函数全部更改时执行此函数,如何执行?是的,没错,displayMessage()
方法将永远不会执行。如果希望将所有标志都放在一个标志中
,则应使用嵌套侦听器,如我的更新答案中所示。它有用吗?