繁体   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