2017-04-23 9 views
0
private boolean authenticateUser(final String role, final String userId) { 
    DatabaseReference roleReference = FirebaseDatabase.getInstance().getReference().child("role").child(role); 
    roleReference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      HashMap<String, String> map = (HashMap<String, String>) dataSnapshot.getValue(); 
      if (map != null) { 
       Set<String> userIds = map.keySet(); 
       if (userIds.contains(userId)) 
        authenticationResult = true; 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    return authenticationResult; 
} 

上記は、ユーザーを認証する機能です。私は真実を返すしたいif (userIds.contains(userId))それ以外はfalseです。しかし、authenticateUserは常にfalseを返します。onDataChange突然呼び出し

+1

リスナーコールバックの非同期性は、この回答で説明されています。http://stackoverflow.com/a/41409942/4815718 –

答えて

0

コードにエラーがないことが確かな場合は、Firebase接続がasyncであることをお知らせします。つまり、戻り値の文はの前に実行され、の前にそのブール値を変更するのに十分な時間があるため、値を返すために非同期メソッドを使用することはできません。

メソッドを変更してvoidを返し、onDataChange内で値の種類の応答メソッドを使用してみます。

例:ジョブが行われていた前に、非同期メソッドが値を返すように意図されていないため、それを適切に行うための唯一の方法となります

private void authenticateUser(final String role, final String userId) { 
DatabaseReference roleReference = FirebaseDatabase.getInstance().getReference().child("role").child(role); 
roleReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     HashMap<String, String> map = (HashMap<String, String>) dataSnapshot.getValue(); 
     if (map != null) { 
      Set<String> userIds = map.keySet(); 
      if (userIds.contains(userId)) 
       authenticationResult = true; 
     } 
     authenticateUserResponse(authenticationResult); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

関連する問題