即使Firebase快照中有子级,为什么我的ArrayList为空

问题描述 投票:0回答:1

我正在尝试从Firebase实时数据库中提取用户数据,datasnapshot确实包含子级和数据,但是当我尝试将其放入数组时,该数组为空。我创建了一个用户类,其中包含与firebase中的属性,重载的构造函数和某些方法相匹配的属性。它不会扩展任何类,但据我所知,这不适用于从Firebase检索数据。

private List<user> usersList = new ArrayList<>();
private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
private DatabaseReference ref = databaseReference.child("Users");

public List<user> getUsers(){
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                Log.i("users", String.valueOf(dataSnapshot.getChildrenCount()));

                for(DataSnapshot child: dataSnapshot.getChildren()){
                    user userRetrieved = child.getValue(user.class);
                    Log.d("USER before array", userRetrieved.getUserName());
                    usersList.add(userRetrieved);
                    for(int i = 0;i < usersList.size(); i++){
                        Log.d("USER", usersList.get(i).getUserName());
                    }

                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.i("ERROR", databaseError.getMessage());
        }
    });

    return usersList;
}

欢迎所有反馈。

java android firebase firebase-realtime-database
1个回答
0
投票

Firebase API是异步的。 addListenerForSingleValueEvent立即返回,并在查询完成后的一段时间后执行传递给您的回调。无法保证会很快发生。同时,您的函数将返回一个最初为空的列表。您可能具有在查询尚未完成的前提下读取它的代码,但实际上查询尚未完成。

最重要的是,您应该只在调用回调之后而不是之前处理查询结果。

© www.soinside.com 2019 - 2024. All rights reserved.