2016-11-11 18 views
0

私はFirebaseリアルタイムデータベースから一つの「ユーザー」オブジェクトを取得したいので、私はValueListenerを追加するので、正直なところ、私はちょうど今愚かな感じが、私はちょうどそれを得ることはありません...Firebaseデータベースなっオブジェクト

、 右? 私はメソッド "getUser"を持っています。これは "User"を返す値です。そこでは私はこれを使用します。

ValueEventListener valueListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot snap : dataSnapshot.getChildren()) 
      { 
       User u = snap.getValue(User.class); 
       if(u.getEmail().equals(userEmail)) 
       { 
        //user = u; 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 
    //Adding the Listener for Single Event 
    fref.child("User").addListenerForSingleValueEvent(valueListener); 
    //Using "u" here then 

今、私は「u」はそこから外れ、どのように私はそれを得るのですか良い方法は、そのユーザーを取得し表示されないのですか?

私はこれが基本でなければなりません知っているが、私はちょうど..事前に

おかげでそれを得ることはありません:)どの程度

答えて

0

:あなただけの世界を作成する必要があり

private User targetUser; 

@Override 
protected void onStart() { 
    super.onStart(); 
    final ValueEventListener userListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      userNameList = new ArrayList<>((ArrayList) dataSnapshot.getValue()); 
      for (User u : userNameList) { 
       if (u.getEmail().equals(userEmail)) { 
        targetUser = u; 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.e(TAG, "onCancelled: Failed to load User list."); 

     } 
    }; 
    userlistReference.addValueEventListener(userListener); 

    mUserListListener = userListener; 
    //use targetUser reference but check if it is null(can be null)... 
} 
-1

あなたのクラスの変数、のように:ちょうどん

private User myUser; 

次に、あなたのリスナー内側:

myUser = u; 

これは、あなたがたCountDownLatchを使用する必要があります...

0

最も簡単な方法である - このオブジェクトは、リスナーが実際にオブジェクトを返す前に呼び出されるまで、あなたは待つようになる:

private User getUser() { 
    final User user = null ; 
    final CountDownLatch cdl = new CountDownLatch(1); 
    ValueEventListener valueListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot snap : dataSnapshot.getChildren()) 
      { 
       User u = snap.getValue(User.class); 
       if(u.getEmail().equals(userEmail)) 
       { 
        user = u; 
        break ; 
       } 
      } 
      cdl.countDown(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      cdl.countDown(); 
     } 
    }; 
    //Adding the Listener for Single Event 
    fref.child("User").addListenerForSingleValueEvent(valueListener); 
    try { 
     cdl.await(); 
    } catch (InterruptedException ie) { 
    } 
    return user ; 
} 
+0

このそれはcld.countDown()内で常に待っているブロックを取得します。 –

+0

@RobertoFernandezこれは本当に 'countDown()'でブロックされていますか?奇妙な、私はそれを見たことがない。通常、 'wait()'をブロックします。そのソリューションは私のために働く... – Benoit