从firebase检索的用户不会在activity变量中设置

时间:2017-01-13 16:56:41

标签: java android firebase

我正在从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;

提前致谢。

2 个答案:

答案 0 :(得分:0)

检查反序列化是否从数据库成功到您的类用户,即您拥有所有正确的字段,公共默认构造函数和getter。

From Firebase doc

答案 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。