[英]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.