Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase数据库获取对象_Java_Android_Firebase_Firebase Realtime Database_Listener - Fatal编程技术网

Java Firebase数据库获取对象

Java Firebase数据库获取对象,java,android,firebase,firebase-realtime-database,listener,Java,Android,Firebase,Firebase Realtime Database,Listener,老实说,我现在觉得自己很愚蠢,但我就是不明白 我想从Firebase实时数据库中获取一个“用户”对象,所以我添加了一个ValueListener,对吗? 我有一个方法“getUser”,它的返回值是“User”。在这里,我使用这个: ValueEventListener valueListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSna

老实说,我现在觉得自己很愚蠢,但我就是不明白

我想从Firebase实时数据库中获取一个“用户”对象,所以我添加了一个ValueListener,对吗? 我有一个方法“getUser”,它的返回值是“User”。在这里,我使用这个:

ValueEventListener valueListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snap : dataSnapshot.getChildren())
            {
                User u = snap.getValue(User.class);
                if(u.getEmail().equals(userEmail))
                {
                   //user = u;
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    //Adding the Listener for Single Event
    fref.child("User").addListenerForSingleValueEvent(valueListener);
    //Using "u" here then
现在我看不到一个好办法让用户“u”离开那里,我怎么才能得到它

我知道这应该是最基本的,但我就是不明白

提前感谢:)

关于:

private User targetUser;

@Override
protected void onStart() {
    super.onStart();
    final ValueEventListener userListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            userNameList = new ArrayList<>((ArrayList) dataSnapshot.getValue());
            for (User u : userNameList) {
                if (u.getEmail().equals(userEmail)) {
                    targetUser = u;
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG, "onCancelled: Failed to load User list.");

        }
    };
    userlistReference.addValueEventListener(userListener);

    mUserListListener = userListener;
    //use targetUser reference but check if it is null(can be null)...
}
私人用户targetUser;
@凌驾
受保护的void onStart(){
super.onStart();
最终值EventListener userListener=新值EventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
userNameList=newarraylist((ArrayList)dataSnapshot.getValue());
for(用户u:userNameList){
if(u.getEmail().equals(userEmail)){
目标用户=u;
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Log.e(标记“onCancelled:无法加载用户列表”);
}
};
userlistReference.addValueEventListener(userListener);
muserListener=userListener;
//使用targetUser引用,但检查它是否为null(可以为null)。。。
}

您只需在类上创建全局变量,如:

private User myUser;
然后在你的听众中,只需做:

myUser = u;

这是最简单的方法…

您必须使用倒计时锁存器-此对象将允许您在返回对象之前等待侦听器被实际调用:

private User getUser() {
    final User user = null ;
    final CountDownLatch cdl = new CountDownLatch(1);
    ValueEventListener valueListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snap : dataSnapshot.getChildren())
            {
                User u = snap.getValue(User.class);
                if(u.getEmail().equals(userEmail))
                {
                    user = u;
                    break ;
                }
            }
            cdl.countDown();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            cdl.countDown();
        }
    };
    //Adding the Listener for Single Event
    fref.child("User").addListenerForSingleValueEvent(valueListener);
    try {
        cdl.await();
    } catch (InterruptedException ie) {
    }
    return user ;
}

这也不起作用,它总是在cld.countDown()中等待阻塞。@RobertoFernandez它在
countDown()上真的被阻塞了。
?奇怪,我从来没见过。通常,它会阻塞
的等待()。这个解决方案对我很有效。。。