2017-04-23 66 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; 
} 

上面是一个验证用户的函数。我想返回true 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) { 

    } 
}); 

这将是做正确的唯一途径,因为异步方法是注定不会做的作业之前返回值。