我正在从MainActivity中的FirebaseDatabase中检索用户:
private void initializeCurrentUser(){
DatabaseReference dbRef = FirebaseDatabase.getInstance()
.getReference()
.child("users")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
dbRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot != null){
User u = dataSnapshot.getValue(User.class);
Log.v("DSREF", "reached");
setCurrentUser(u);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
在日志之后检查:
User u = dataSnapshot.getValue(User.class);
用户存在且初始化,就像调用u.getEmail()一样,返回currentUser的电子邮件。
但是,在致电时
setCurrentUser(u);
这是MainActivity的方法:
public void setCurrentUser(User user){
this.currentUser = user;
}
currentUser将设置为NULL值,在调用currentUser.getEmail()等方法时会导致NullPointerException;
提前致谢。
答案 0 :(得分:0)
检查反序列化是否从数据库成功到您的类用户,即您拥有所有正确的字段,公共默认构造函数和getter。
答案 1 :(得分:0)
我认为你得到了nullpointer,因为你在使用Firebase Listener初始化之前调用了它。这应该可以解决你的问题。
/*
* Inside your Activity
*/
private Fragment fragment; // Store your fragment when you create it.
private void initializeCurrentUser(){
/* .. */
dbRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot != null){
User u = dataSnapshot.getValue(User.class);
Log.v("DSREF", "reached");
setCurrentUser(u);
((MyFragment) fragment)).notifyLoaded();
}
}
/* .. */
});
}
/*
* Inside your Fragment
*/
String email;
public void notifyLoaded() {
// Do not call ((MainActivity)getActivity).getCurrentUser().getEmail() anywhere else in onCreate(View) etc..
email = ((MainActivity)getActivity).getCurrentUser().getEmail();
// Do things with non-null email now.
}
虽然这样可行,但我建议您更新Activity-Fragment通信以使用Interfaces或EventBus。