Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onDataChange调用突然 private boolean authenticateUser(最终字符串角色,最终字符串用户ID){ DatabaseReference roleReference=FirebaseDatabase.getInstance().getReference().child(“角色”).child(角色); roleReference.addValueEventListener(新的ValueEventListener(){ @凌驾 公共void onDataChange(DataSnapshot DataSnapshot){ HashMap=(HashMap)dataSnapshot.getValue(); if(map!=null){ 设置userIds=map.keySet(); if(userId.contains(userId)) authenticationResult=true; } } @凌驾 已取消的公共void(DatabaseError DatabaseError){ } }); 返回authenticationResult; }_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android onDataChange调用突然 private boolean authenticateUser(最终字符串角色,最终字符串用户ID){ DatabaseReference roleReference=FirebaseDatabase.getInstance().getReference().child(“角色”).child(角色); roleReference.addValueEventListener(新的ValueEventListener(){ @凌驾 公共void onDataChange(DataSnapshot DataSnapshot){ HashMap=(HashMap)dataSnapshot.getValue(); if(map!=null){ 设置userIds=map.keySet(); if(userId.contains(userId)) authenticationResult=true; } } @凌驾 已取消的公共void(DatabaseError DatabaseError){ } }); 返回authenticationResult; }

Android onDataChange调用突然 private boolean authenticateUser(最终字符串角色,最终字符串用户ID){ DatabaseReference roleReference=FirebaseDatabase.getInstance().getReference().child(“角色”).child(角色); roleReference.addValueEventListener(新的ValueEventListener(){ @凌驾 公共void onDataChange(DataSnapshot DataSnapshot){ HashMap=(HashMap)dataSnapshot.getValue(); if(map!=null){ 设置userIds=map.keySet(); if(userId.contains(userId)) authenticationResult=true; } } @凌驾 已取消的公共void(DatabaseError DatabaseError){ } }); 返回authenticationResult; },android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,上面是一个验证用户身份的函数。我想返回trueif(userId.contains(userId))else false。但是authenticateUser总是返回false。如果您确定代码没有错误,我想提醒您Firebase连接是异步的。也就是说,您不能使用异步方法返回值,因为返回语句将在您有足够的时间更改该布尔值之前执行 尝试更改该方法,使其返回void,并在onDataChange中使用一种具有该值的响应方法 例如: private boolean authenticateUser(fi

上面是一个验证用户身份的函数。我想返回true
if(userId.contains(userId))
else false。但是authenticateUser总是返回false。

如果您确定代码没有错误,我想提醒您Firebase连接是异步的。也就是说,您不能使用异步方法返回值,因为返回语句将在您有足够的时间更改该布尔值之前执行

尝试更改该方法,使其返回void,并在onDataChange中使用一种具有该值的响应方法

例如:

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;
}
private void authenticateUser(最终字符串角色,最终字符串用户ID){
DatabaseReference roleReference=FirebaseDatabase.getInstance().getReference().child(“角色”).child(角色);
roleReference.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
HashMap=(HashMap)dataSnapshot.getValue();
if(map!=null){
设置userIds=map.keySet();
if(userId.contains(userId))
authenticationResult=true;
}
authenticateUserResponse(authenticationResult);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

这将是正确执行此操作的唯一方法,因为异步方法并不意味着在作业完成之前返回值。

侦听器回调的异步性质在以下答案中解释:
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) {

    }
});