[英]How to chain 2 EventListeners in Firebase-Android so that the first one doesn't continue until second one finishes?
我正在尝试从侦听器A从Firebase中获取一些数据,然后将基于从侦听器A获得的一些ID与侦听器B在另一个节点下进行搜索,并且当我从侦听器B接收到数据时,我想将其附加到侦听器一个数据。 基本上,我在Firebase中有2个节点:帖子和用户。 帖子中包含一些数据和一个用户ID。 当我想显示数据库中的所有帖子时,我将每个帖子添加到RecyclerView中,但是在将它们添加到该View之前,我需要获取一些用户数据,然后(将这两个收集的数据结合)将其添加到recyclerView中。 。
我找不到任何可在线尝试的内容(除了一些阻止用户界面的东西,我刚开始使用Android时我宁愿不要这样做)。 我知道Firebase是异步的,并且Java没有Promise或async / await,所以IDK还有什么可以尝试的。 在当前的实现中,我没有实现我想要的(显然)。
private void initialPopulatePostsFromDB(){
mDatabase.limitToFirst(2).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<IndividualPost> postsDB = new ArrayList<>();
for(DataSnapshot postSnapShot : dataSnapshot.getChildren()){
oldestPostId = postSnapShot.getKey();
final IndividualPost indivPost = postSnapShot.getValue(IndividualPost.class);
indivPost.setContents(typePostContents);
/*
FirebaseDatabase.getInstance().getReference("/users").child(indivPost.getUserId()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
userAccount = dataSnapshot.getValue(UserAccount.class);
indivPost.setUserId(userAccount.getName());
System.out.println("[1] ACC NAME: " + indivPost.getUserId());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
*/
FirebaseDatabase.getInstance().getReference("/users").child(indivPost.getUserId()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
userAccount = dataSnapshot.getValue(UserAccount.class);
indivPost.setUserId(userAccount.getName());
System.out.println("[1] ACC NAME: " + indivPost.getUserId());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
System.out.println("[2] ACC NAME: " + indivPost.getUserId());
postsDB.add(indivPost);
System.out.println("[3] ACC NAME: " + indivPost.getUserId());
}
posts.addAll(postsDB);
mAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
我希望显示新数据,将来自用户的数据与帖子结合在一起。
I expected to be printed:
[1] ACC NAME John
[2] ACC NAME John
[3] ACC NAME John
but it's actually
[2] BniepYpQuh6VgMF6L2
[3] BniepYpQuh6VgMF6L2
[1] John
我希望显示新数据,将来自用户的数据与帖子结合在一起。
之所以没有获得新数据,是因为您要在第一个侦听器中添加indivPost
并在第一个侦听器中通知回收视图,然后才能在第二个侦听器中获取用户数据。这种方式无法实现所需的功能,因为您的for loop
是同步的并且侦听器异步。 更改您的Firebase结构以存储带有帖子的用户名,因此您无需再次调用即可获取用户名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.