java - Firebase,为什么 addValueEventListener 不会被触发?
问题描述
我需要在我的 Firebase 数据库中获取另一个孩子的值,addChildEventListener
但addValueEventListener
不会被触发。这意味着user_name_list
它将永远是空的。我该如何解决这个问题?谢谢!
mDatabase.child("all_ads").child("companies").child(company_id).child("ads").child(ad_id).child("chat").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
mess_list = new ArrayList<>();
chat_id_list = new ArrayList<>();
user_name_list = new ArrayList<>();
for (DataSnapshot uniqueKey : dataSnapshot.getChildren()) {
chat_id_list.add(String.valueOf(uniqueKey.getKey()));
mess_list.add(String.valueOf(uniqueKey.getValue()));
mDatabase2 = FirebaseDatabase.getInstance().getReference();
mDatabase2.child("usersacc").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
user_name_list.add(String.valueOf(dataSnapshot2.child(String.valueOf(uniqueKey.getKey())).child("username").getValue()));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
list_fonct(mess_list, chat_id_list, user_name_list);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
这是我的数据库的结构。
{
"all_ads" : {
"companies" : {
"VchGVZITqVVJMAcrI8bJ1WLxPdq2" : {
"ads" : {
"1_ad" : {
"chat" : [ null, {
"TWTlzga3jEfkIy5euZ5lyBo9YHL2" : "Hi!"
}, {
"TWTlzga3jEfkIy5euZ5lyBo9YHL2" : "hello"
}, {
"gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "a"
}, {
"gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "b"
}, {
"gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "c"
} ]
}
}
}
}
},
"usersacc" : {
"TWTlzga3jEfkIy5euZ5lyBo9YHL2" : {
"username" : "username1"
},
"gG0DoRAAFqUkWk8KZWKLb96yHXX2" : {
"username" : "username2"
}
}
}
解决方案
问题不在于您ValueEventListener
没有被触发,而是您list_fonct
在此之前打电话。
我将在底部包含一些链接以了解有关此内容的更多信息,但现在简单的解决方法是将调用移动到list_fonct
加载onDataChange
用户数据的调用中:
mDatabase.child("all_ads").child("companies").child(company_id).child("ads").child(ad_id).child("chat").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
mess_list = new ArrayList<>();
chat_id_list = new ArrayList<>();
user_name_list = new ArrayList<>();
for (DataSnapshot uniqueKey : dataSnapshot.getChildren()) {
chat_id_list.add(String.valueOf(uniqueKey.getKey()));
mess_list.add(String.valueOf(uniqueKey.getValue()));
mDatabase2 = FirebaseDatabase.getInstance().getReference();
mDatabase2.child("usersacc").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
user_name_list.add(String.valueOf(dataSnapshot2.child(String.valueOf(uniqueKey.getKey())).child("username").getValue()));
list_fonct(mess_list, chat_id_list, user_name_list); // moved here
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
}
}
另见:
推荐阅读
- java - 如何在后台收听屏幕触摸
- orm - 如何避免聚合依赖于外部包含?
- sql - 获取在sql server中以逗号分隔的字符串传递所有ID的所有记录
- r - 如何将图例值显示为百分比
- java - javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建
- android - 如图所示,底部栏的名称是什么?
- sharepoint - 尝试创建共享点客户端开发时 gulp 服务显示错误
- html - HTML CSS如何在行中显示div
- javascript - 如何在js的传单中提取正确的ID?
- javascript - amCharts 4 - 如何在动态加载+更新数据集后为图表设置动画?