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