我成功地用以下代码获取了对象:

public void retrieveUser(final String email){
        firebaseUsersRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                    if(messageSnapshot.getKey().equals(Email.encodeID(email))){

                        retrievedUser = messageSnapshot.getValue(User.class);
                        break;
                    }
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) { }
        });
    }

(请注意retrievedUser是一个类属性,因此是一个字段。)
我正在从代码访问该字段,但即使我看到它接受调试器上的值,调用代码上的值也是空的。
有什么暗示吗?我不能把它放在方法本身中,这样就可以了吗?:
public User retrieveUser(final String email);

那么,总而言之,如何返回User对象本身?
谢谢

最佳答案

firebase异步加载和同步数据。您不能确定您的字段retrievedUser在访问时是否有值,因为您不知道firebase何时调用onDataChange事件。
您必须完成依赖于retrievedUser事件处理程序中的onDataChange的工作,如下所示。

firebaseUsersRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
            if(messageSnapshot.getKey().equals(Email.encodeID(email))){
                retrievedUser = messageSnapshot.getValue(User.class);
                doSomethingWithTheUser(retrievedUser);
            }
        }
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {}
});

10-01 03:47