2016-11-28 45 views
0

我想讀取我的數據庫中的節點,並返回在單一方法中檢索到的值。當我運行代碼時,數據會記錄在控制檯上,但該方法返回空值。如何從onDataChanged返回數據方法

我所知道的

我知道,在火力地堡裏,因此在onDataChanged代碼是最後執行的後臺自動檢索/同步與數據庫。

什麼,我不知道

如何讓我的方法返回從onDataChanged方法得到的值。

我的代碼:

public static String telephone; 
public static String getMyNumber(){ 
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    DatabaseReference r = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("phone"); 
    r.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      telephone = dataSnapshot.getValue(String.class); 
      Log.d("YourTag", telephone); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    return telephone; 
} 
+0

你'getMyNumber'方法同步運行在主線程中的代碼。數據是從Firebase數據庫在單獨的線程上異步檢索的。如果您的目標是常規Java/JVM,則可以使用信號燈來同步這兩者。在Android上,這是不可能的。看到我的答案在這裏:http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener/33204705#33204705 –

+0

好的感謝評論。我正在使用Android。 –

+0

在這種情況下,您沒有其他選擇,然後擁抱Firebase的異步特性(以及大多數現代雲服務)。 –

回答

0

歡迎異步編程。當你通過調用addValueEventListener附加該偵聽器,您的應用程序不會自動獲得的價值(或onDataChange不會被直接調用。

如果您對telephone檢索後更新UI,然後把該onDataChange方法。

希望這有助於:)