簡體   English   中英

如何在Firebase-Android中鏈接2個EventListener,以使第一個EventListener直到第二個EventListener結束才繼續?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM