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;
}
以上是验证用户身份的功能。我想返回true if (userIds.contains(userId))
否则为false。但authenticateUser始终返回false。
答案 0 :(得分: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) {
}
});
这将是正确执行此操作的唯一方法,因为异步方法并不意味着在作业完成之前返回值。