Java 从firebase检索到的用户不会在活动变量中设置

Java 从firebase检索到的用户不会在活动变量中设置,java,android,firebase,Java,Android,Firebase,我正在从FirebaseDatabase中检索用户,在MainActivity中: private void initializeCurrentUser(){ DatabaseReference dbRef = FirebaseDatabase.getInstance() .getReference() .child("users") .child(FirebaseAuth.getIn

我正在从FirebaseDatabase中检索用户,在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;
    }
在以下情况之后,使用日志进行检查:

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收到了良好的数据