Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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
Java 为什么null在重写方法中返回甚至更改?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 为什么null在重写方法中返回甚至更改?

Java 为什么null在重写方法中返回甚至更改?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在开发一个带有Firebase实时数据库的android应用程序。现在,我在执行查询后查找UserProfile对象。因此,我写了以下内容来获取UserProfile 这是我的UserProfile类 数据库结构如下所示 userProfile |__ hD77qeMX3IPQcKGcuSBOgJOIhHk2 |__ created | |__ date: 22 | |__ day: 0 | |__ hours: 21 | |__ mi

我正在开发一个带有Firebase实时数据库的android应用程序。现在,我在执行查询后查找UserProfile对象。因此,我写了以下内容来获取UserProfile

这是我的UserProfile类

数据库结构如下所示

userProfile
|__ hD77qeMX3IPQcKGcuSBOgJOIhHk2
    |__ created
    |   |__ date: 22
    |   |__ day: 0
    |   |__ hours: 21
    |   |__ minutes: 26
    |   |__ month: 3
    |   |__ seconds: 6
    |   |__ time: 1524421566951
    |   |__ timezoneOffset: -180
    |   |__ year: 118
    |__ email: "first_name.last_name.2018@gmail.com"
    |__ firstName: "first_name"
    |__ id: "hD77qeMX3IPQcKGcuSBOgJOIhHk2"
    |__ lastName: "last_name"
这里是我得到错误的地方

// query method
public UserProfile getUserProfile(String id) {
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("userProfile");
    final UserProfile[] userProfile = {null};
    Query query = databaseReference.child(id);//orderByChild("id").equalTo(0);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                userProfile[0] = dataSnapshot.getValue(UserProfile.class);
                // print statement for userProfile[0] shows the UserProfile exactly! which is not null
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return userProfile[0];
}

onDataChange方法从Firebase获取实际的UserProfile,但最后getUserProfile方法返回null。从getUserProfile方法获取UserProfile缺少什么?

Firebase调用是异步的,通过从方法返回一个值,您可以同步执行。您的结果尚未到达userProfile数组

public UserProfile getUserProfile(String id) {
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("userProfile");
    final UserProfile[] userProfile = {null};
    Query query = databaseReference.child(id);//orderByChild("id").equalTo(0);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                userProfile[0] = dataSnapshot.getValue(UserProfile.class);
                // print statement for userProfile[0] shows the UserProfile exactly! which is not null
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return userProfile[0];
}
因此,当方法执行时,它将调度事件侦听器,最后是返回userProfile[0]的行;将立即执行。然后,稍后当异步调用返回一个值时,将调用onDataChange方法,您将得到一个结果

您需要调用一个方法并在onDateChange方法中使用您的数据,因为此时您的数据将准备就绪

public void getUserProfile(String id) {
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("userProfile");
    final UserProfile[] userProfile = {null};
    Query query = databaseReference.child(id);//orderByChild("id").equalTo(0);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                userProfile[0] = dataSnapshot.getValue(UserProfile.class);
                // update ui here
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}
我通常做的是编写一个UI更新方法,并在onDateChanged中使用它

public void updateUI(UserProfile profile){
//update UI with profile
}


public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    userProfile[0] = dataSnapshot.getValue(UserProfile.class);
                    updateUI(userProfile[0]);
                }
            }

这里缺少异步执行的要点。添加侦听器以从firebase数据库检索值时,数据不能立即返回给调用方函数。完成从firebase获取数据的后台异步任务后,数据将在onDataChanged方法中可用

向我们展示您的UserProfile类和数据库结构:
public void updateUI(UserProfile profile){
//update UI with profile
}


public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    userProfile[0] = dataSnapshot.getValue(UserProfile.class);
                    updateUI(userProfile[0]);
                }
            }