Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase数据库Android-不使用ValueEventListeners检索信息_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Firebase数据库Android-不使用ValueEventListeners检索信息

Firebase数据库Android-不使用ValueEventListeners检索信息,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我的应用程序中有用户,我在Firebase数据库中存储关于他们的附加信息。我需要在多个活动中检索其他信息。我不想使用ValueEventListeners,因为除非数据库中有任何更改,否则不会调用它们。如何在不使用ValueEventListeners的情况下从数据库中获取有关用户的信息 在ProfileFragment中,我需要获取name和departmant值 我从Firebase获取当前用户,并尝试使用函数获取其他信息 talker = new DatabaseTalk(); Fire

我的应用程序中有用户,我在Firebase数据库中存储关于他们的附加信息。我需要在多个活动中检索其他信息。我不想使用ValueEventListeners,因为除非数据库中有任何更改,否则不会调用它们。如何在不使用ValueEventListeners的情况下从数据库中获取有关用户的信息

在ProfileFragment中,我需要获取name和departmant值

我从Firebase获取当前用户,并尝试使用函数获取其他信息

 talker = new DatabaseTalk();
FirebaseUser currentUser = mAuth.getCurrentUser();
// Get info of logged in user with talker.
loggedInUser = talker.getUserFromID(currentUser.getUid());
这是我的DatabaseTalker类,用于处理对数据库的读写操作

public class DatabaseTalk {
    private FirebaseDatabase mDatabase;
    private DatabaseReference UserRef;
    private DatabaseReference SurveyRef;
    private List<User> userList;


    public DatabaseTalk(){
        mDatabase = FirebaseDatabase.getInstance();
        UserRef = mDatabase.getReference("users");
        UserRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot child: dataSnapshot.getChildren()){
                    userList.add(child.getValue(User.class));
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.w("Error", "Failed to read value.", databaseError.toException());
            }
        });
        SurveyRef = mDatabase.getReference("surveys");
    }
    public void WriteUser(User usr){
        UserRef.child(usr.getUserID()).setValue(usr);
    }
    public void WriteSurvey(Survey survey){SurveyRef.push().setValue(survey);}
    public User getUserFromID(String id){
        for(User usr: userList){
            if(usr.getUserID().equals(id))
                return usr;
    }
        return null;
}
}

我解决了这个问题。事实证明,我不知道Firebase实际上是如何工作的。由于onDataChange进行异步调用,因此在函数上编写侦听器定义是无用的,因为onDataChange通常不会在函数终止之前触发,这会导致函数返回null值。 我在onCreate方法中定义ValueEventListeners。我的ProfileFragment创建几秒钟后就会触发。我认为最好使用进度对话框等待


感谢所有对该问题感兴趣的人。

您能否编辑您的问题以显示您的数据库结构和未按预期方式运行的代码?请添加您的数据库结构。如果您使用ValueEventListeners,您可以获得信息。如果没有更新,它也可以工作
public User getUserFromID(String id){
        DatabaseReference newRef = mDatabase.getReference("users");
        DatabaseReference ds = newRef.child(id);
        ds.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                userList.add(dataSnapshot.getValue(User.class));
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        return  userList.get(0);
    }