Java Firebase数据库获取对象
老实说,我现在觉得自己很愚蠢,但我就是不明白 我想从Firebase实时数据库中获取一个“用户”对象,所以我添加了一个ValueListener,对吗? 我有一个方法“getUser”,它的返回值是“User”。在这里,我使用这个: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
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()上真的被阻塞了。
?奇怪,我从来没见过。通常,它会阻塞的等待()。这个解决方案对我很有效。。。