2017-09-25 16 views
1

私は、このユーザーがデータベースに存在するかどうかを確認するFirebase内部からデータを取得したいが、私は解決できない問題が発生し、リスナー・トリガー後半、これは私のコードです: -firebaseデータベースからフェッチデータ

  • 私がループしながら、削除する場合、私は、オブジェクトの取得ができない高速な
  • ループ私は無限ループに入りながら、私は続けるならば、私はなぜリスナー誘発しない理由を 分からない

    DataSnapshot fetched ; 
    public boolean user_exist(final String user) throws Exception { 
    users.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         fetched = dataSnapshot ; 
        } 
        @Override 
        public void onCancelled(DatabaseError databaseError) { 
        } 
    }); 
    while (fetched == null){ 
        Log.e("dbController","not fetched yet"); 
    } 
    return fetched.hasChild(user); 
    } 
    
+0

あなたがイベントをトリガーしているか表示されませんが。 whileループがスレッドをブロックする可能性はありますか?別のスレッドからイベントをトリガする必要があります。 100%稼働している間は使用しないでください。リスナーはキューに追加することができ、アイテムがキューに追加されるとログに記録することができます。 –

+0

データはFirebaseから非同期にロードされます。 (通常、同期の)関数から返すことはできません。 https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

を参照して、メインスレッドがリスナートリガに十分な時間待機するようにすることをお勧めしますか?私はすでにこのソリューションを試してみましたが、最初にトレーニングをしませんでしたが、関数が呼び出されたときにnullが2回目にNULLになっています。 –

答えて

0

Firebaseはデータベースからデータを取得してアプリに持っていかなければなりません。これには時間がかかることがありますので、バックグラウンドで実行する必要があります。 valueEventListenerを追加すると、バックグラウンドでフェッチが実行されます。あなたはデータがまだ読み込んで表示するプログレスバーを表示し、データが手にしたら、残りのコード実行することがあります。

users.child(user).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()) { 
      funUserExists(); 
     } else { 
      funNoUser(); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) { 
    } 
}); 
関連する問題