2016-04-28 216 views
1

Java对象我设法与此代码的对象:检索火力地堡

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对象本身?

谢谢

回答

0

您应该能够使用回调或返回语句返回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) { 

     } 
    }); 

} 
+0

什么是LoadEventsCallback?它不属于Firebase,我不确定是否需要实施它 –

+0

这是我定义的一个回调,并非特定于Firebase。它来自我正在处理的项目,您可以在这里看到:https://github.com/Austin-Droids/austin-feeds-me/blob/master/app/src/main/java/com/example/utfeedsme /data/EventsDataSource.java – dazza5000

2

火力地堡的负载和数据同步异步。您无法确定您的字段retrievedUser在访问该字段时会有价值,因为您不知道Firebase何时会拨打onDataChange事件。

您必须在onDataChange这样的事件处理程序中根据retrievedUser完成您的工作。

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) {} 
}); 
+0

非常感谢你的回答哥们,我会将它标记为正确的,但在我有几个问题之前;所以基本上这意味着我被迫在onDataChange部分右边的pal上实现逻辑? –

+0

是的,但你可以调用像我在答案中的方法,所以你的代码仍然组织良好。 Firebase的这种异步特性非常有用,因为它不会阻止您的线程,您可以继续做其他工作并在Firebase到达时处理响应。 –