2016-04-28 156 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到達時處理響應。 –