我设法用这段代码获取对象:
age
(请注意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);
对象本身?
由于
答案 0 :(得分:3)
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) {}
});
答案 1 :(得分:2)
您应该能够使用回调或返回语句返回retrieveUser对象。下面是一些代码,展示了如何使用回调返回值。
@Override
public void getEvents(final LoadEventsCallback callback) {
final List<Event> events = new ArrayList<Event>();
Firebase ref = new Firebase("https://austin-feeds-me.firebaseio.com/events");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Event event = snapshot.getValue(Event.class);
events.add(event);
}
callback.onEventsLoaded(events);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}