Java 从firebase检索到的用户不会在活动变量中设置
我正在从FirebaseDatabase中检索用户,在MainActivity中:Java 从firebase检索到的用户不会在活动变量中设置,java,android,firebase,Java,Android,Firebase,我正在从FirebaseDatabase中检索用户,在MainActivity中: private void initializeCurrentUser(){ DatabaseReference dbRef = FirebaseDatabase.getInstance() .getReference() .child("users") .child(FirebaseAuth.getIn
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) {
}
});
}
public void setCurrentUser(User user){
this.currentUser = user;
}
在以下情况之后,使用日志进行检查:
User u = dataSnapshot.getValue(User.class);
用户存在并初始化,就像调用u.getEmail()返回当前用户的电子邮件
但是,打电话的时候
setCurrentUser(u);
这是MainActivity中的一种方法:
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) {
}
});
}
public void setCurrentUser(User user){
this.currentUser = user;
}
currentUser将被设置为NULL值,在调用currentUser.getEmail()等方法时导致NullPointerException
提前感谢。检查从数据库到类用户的反序列化是否成功,即是否具有所有正确的字段、公共默认构造函数和getter
我认为您得到的是空指针,因为您在使用Firebase侦听器初始化它之前调用了它。这会解决你的问题
/*
* 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.
}
虽然这会起作用,但我建议您更新活动片段通信以使用接口或事件总线。何时/何地调用currentUser.getEmail();?例如,在设置currentUser之后,您可以在哪里发布获取空指针的代码吗?当从碎片调用((MainActivity)getActivity)getCurrentUser().getEmail/Name/etc时,可能是数据库中的节点为空,也可能是调用onDataChange方法并获取用户的时间问题,因为它是异步的(更可能是这样)。我也这样做了,从数据库中检索另一个节点的数据列表,它完全正常工作。该节点不是空的。问题是,在mainActivity中设置currentUser后,从firebase下载后立即变为空,但onDataChange中的User对象不是空的。您可以添加
Log.d吗(“TAG”,“setCurrentUser”);
在setCurrentUser()内部,以及Log.d(“TAG”,“onDataChange”);
在onDataChange()内部,然后发布日志?我已经在onDataChange中添加了一个日志,就像带有REACH的日志一样,但试图从当前用户那里获取电子邮件,并提供正确的数据。Log.v(“DSREF”,u.getEmail());然后,我在setCurrentUser、log.v(“DSREF”,user.getEmail())中添加了一个日志;这给了我一个错误:尝试调用虚拟方法“java.lang.String com.minimaart.studentlife.models.user.getEmail()'在空对象引用上,传递前的对象不是空的,但传递后立即变为空OK,在我的setCurrentUser代码中是:Log.v(“DSREF”,currentUser.getEmail());this.currentUser=user;我在初始化之前调用了getEmail,在设置之前和之后放置了两个日志,currentUser收到了良好的数据