如何获得一个valueEventListener()的结果并在另一个中使用它?

时间:2019-03-22 18:29:45

标签: java android firebase firebase-realtime-database

我有一个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

但这对我不起作用。预先感谢您的回答。

1 个答案:

答案 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) {}
});