Java 为什么null在重写方法中返回甚至更改?
我正在开发一个带有Firebase实时数据库的android应用程序。现在,我在执行查询后查找UserProfile对象。因此,我写了以下内容来获取UserProfile 这是我的UserProfile类 数据库结构如下所示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
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]);
}
}