2016-11-28 10 views
0

データベース内のノードを読み取り、取得した値を単一のメソッドで返そうとしています。コードを実行すると、データはコンソールに記録されますが、このメソッドはnull値を返します。私は知っonDataChangedメソッドからデータを返す方法

私はFirebaseは/バックグラウンドで自動的にデータベースので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をターゲットにしている場合は、セマフォを使用して2つを同期させることができます。 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メソッド内のコード。

・ホープ、このことができます:)

関連する問題