我有一个valueEventListener(),用于从Firebase获取数据。
这是第一个。
sectionReference.child(classID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
uidArrayList.add(snapshot.getKey());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
我想在 uidArrayList 中获取UID列表,并使用它来执行其他一些功能。
这是第二个。
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
getUIDsInCurrentClass();
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
User user = snapshot.getValue(User.class);
if(user.getRole().equals("student") && uidArrayList.contains(user.getUid())){
studentArrayList.add(user);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
在第二个侦听器中,您可以看到我要访问 uidArrayList 的内容。我使用Log.d看到ArrayList的大小为0,这意味着它在第二个侦听器中被调用时并未初始化。
有什么方法可以确保在下一个ValueEventListener()中访问 uidArrayList 之前,使用所有值对其进行初始化。
我已经尝试过这样做,Event Handlers & Event Listeners Independent of one Another
但这对我不起作用。预先感谢您的回答。
答案 0 :(得分:1)
有什么方法可以确保在下一个ValueEventListener()中访问uidArrayList之前,使用所有值对其进行初始化。
是的。我能想到的最简单的解决方案是使用嵌套查询。因此,第二个查询必须嵌套在第一个查询中,以确保uidArrayList
不为空。因此,代码应如下所示:
sectionReference.child(classID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
uidArrayList.add(snapshot.getKey());
}
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//getUIDsInCurrentClass();
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
User user = snapshot.getValue(User.class);
if(user.getRole().equals("student") && uidArrayList.contains(user.getUid())){
studentArrayList.add(user);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});