Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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 我需要等待,直到侦听器将布尔值从null更改为false/true_Android_Firebase_Firebase Realtime Database_Listener - Fatal编程技术网

Android 我需要等待,直到侦听器将布尔值从null更改为false/true

Android 我需要等待,直到侦听器将布尔值从null更改为false/true,android,firebase,firebase-realtime-database,listener,Android,Firebase,Firebase Realtime Database,Listener,我有一个Firebase监听器,它可以检查用户是否存在,我正在使用Firebase数据库进行登录/注册,以判断用户名是否已被使用,问题是它需要在注册按钮上单击两下才能工作,因为监听器无法判断用户名是否存在或速度不够快,只有在第二次点击时,当它已经决定第一次点击时,它才可以注册,但是如果我现在更改用户名,它不会真正检查第二次点击的用户名,即使它被使用,它也会工作 database = FirebaseDatabase.getInstance(); DatabaseReference myR

我有一个Firebase监听器,它可以检查用户是否存在,我正在使用Firebase数据库进行登录/注册,以判断用户名是否已被使用,问题是它需要在注册按钮上单击两下才能工作,因为监听器无法判断用户名是否存在或速度不够快,只有在第二次点击时,当它已经决定第一次点击时,它才可以注册,但是如果我现在更改用户名,它不会真正检查第二次点击的用户名,即使它被使用,它也会工作

database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
                clear = false;
            }else
                clear = true;
        }
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            clear = false;
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });

    //insert check if clear has value

    if(!clear) //TODO FIX takes time to the listener to do the job
        return false;

clear是一个布尔型变量,在第一次运行此代码时为null,此代码用于检查是否使用用户名

可能您的代码如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    signUpBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (checkUserExists()) {
                ...
            } else {
                signUp();
            }
        }
    }
}

private boolean checkUserExists() {
    database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
                clear = false;
            }else
                clear = true;
        }
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            clear = false;
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });

    //insert check if clear has value

    if(!clear) //TODO FIX takes time to the listener to do the job
        return false;
}

private void signUp() {
    ...
}
您应该将其更改为:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    signUpBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            checkUserExists();
        }
    }
}

private boolean checkUserExists() {
    database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
            } else {
                signUp(); // sign up here
            }
        }
        @Override
        public void onCancelled(DatabaseError error) {
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });
}

private void signUp() {
    ...
}
您还可以在检查用户数据时阻止用户输入:

private boolean checking = false; // added

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    signUpBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (checking) return; // added
            checkUserExists();
            checking = true; // added
        }
    }
}

private boolean checkUserExists() {
    database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            checking = false; // added
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
            } else {
                signUp(); // sign up here
            }
        }
        @Override
        public void onCancelled(DatabaseError error) {
            checking = false; // added
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });
}

private void signUp() {
    ...
}

希望它能工作。

您不应该尝试返回从回调中分配的值。您应该进行自己的回调,您可以设置enable=false,直到侦听器没有响应!!代码不是那样的,但是我把它改成了这样,现在它工作得非常好!非常感谢你:D@NetanelMalichi伟大的